<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>www.jannikegger.com</title>
	<atom:link href="http://www.jannikegger.com/feed/rss2/" rel="self" type="application/rss+xml" />
	<link>http://www.jannikegger.com</link>
	<description>Tipps und Tricks für iPhone Entwickler</description>
	<lastBuildDate>Fri, 25 Nov 2011 07:24:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Neue App &#8211; der Alltagshelfer ist da</title>
		<link>http://www.jannikegger.com/2011/11/16/neue-app-der-alltagshelfer-ist-da/</link>
		<comments>http://www.jannikegger.com/2011/11/16/neue-app-der-alltagshelfer-ist-da/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 13:51:38 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[iPhone Programmierung]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=350</guid>
		<description><![CDATA[Heute gibt es einen Artikel in eigener sache. Gestern am 15.11.2011 wurde endlich wieder eine neue App fertig und von Apple freigegen. Nähere Informationen zum neuen Alltaghelfer finde Ihr im App-Store oder hier im Blog unter dem Menüpunkt &#8220;Projekte&#8220;. Viel spaß damit]]></description>
			<content:encoded><![CDATA[<p>Heute gibt es einen Artikel in eigener sache.<br />
Gestern am 15.11.2011 wurde endlich wieder eine neue App fertig und von Apple freigegen.</p>
<p>Nähere Informationen zum neuen Alltaghelfer finde Ihr im <a title="Alltagshelfer im Apple App-Store" href="http://itunes.apple.com/de/app/alltagshelfer/id478573263?l=de&amp;ls=1&amp;mt=8">App-Store</a> oder hier im Blog unter dem Menüpunkt &#8220;<a title="App Projekte - Alltagshelfer" href="http://www.jannikegger.com/projekte/">Projekte</a>&#8220;.</p>
<p>Viel spaß damit <img src='http://www.jannikegger.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/11/16/neue-app-der-alltagshelfer-ist-da/feed/rss2/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NSDate &#8211; Ermitteln des Wochentages mit nur einer Zeile Code (ohne NSDateFormatter!)</title>
		<link>http://www.jannikegger.com/2011/10/10/nsdate-ermitteln-des-wochentages-mit-nur-einer-zeile-code-ohne-nsdateformatter/</link>
		<comments>http://www.jannikegger.com/2011/10/10/nsdate-ermitteln-des-wochentages-mit-nur-einer-zeile-code-ohne-nsdateformatter/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 14:16:24 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[Allgemeine Tipps]]></category>
		<category><![CDATA[iPhone Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=323</guid>
		<description><![CDATA[Problem: Arbeitet man mit NSDate-Objekten muss man immer wieder diverse Spezifikationen eines Datums ermitteln. Eines der (von mir) oft genutzen attribute ist der Wochentag (weekday). In den meisten Foren/Blogs ist der vorgeschlagene Lösungsansatz: - Nutze NSDateFormatter, generiere dir einen NSString aus einem Datum und fange mit einer IF/ELSE Orgie das zurcükgelieferte kürzel ab. Bei sowas [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem:</strong> Arbeitet man mit NSDate-Objekten muss man immer wieder diverse Spezifikationen eines Datums ermitteln. Eines der (von mir) oft genutzen attribute ist der Wochentag (weekday).<br />
In den meisten Foren/Blogs ist der vorgeschlagene Lösungsansatz:<br />
- Nutze NSDateFormatter, generiere dir einen NSString aus einem Datum und fange mit einer IF/ELSE Orgie das zurcükgelieferte kürzel ab.</p>
<p>Bei sowas stellen sich mir die Nackenhaare auf!<strong></strong></p>
<p><strong><span id="more-323"></span>Lösung:</strong> Das ganze lässt sich auch sehr elegant über nur eine Zeile abbilden:</p>
<pre class="brush: objc; title: ; notranslate">
int myWeekday = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:myNsDateObject] weekday];
NSLog(@&quot;myWeekday: %i&quot;, myWeekday); // Sunday returns 0
</pre>
<p>Wichtig ist, wie ich auch schon im Code kommentiert habe, dass Sonntag 0 zurückliefert. Nicht Montag!</p>
<p>Ich hoffe euch gefällt der Einzeiler so gut wie mir <img src='http://www.jannikegger.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/10/10/nsdate-ermitteln-des-wochentages-mit-nur-einer-zeile-code-ohne-nsdateformatter/feed/rss2/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xcode richtig deinstallieren</title>
		<link>http://www.jannikegger.com/2011/08/15/xcode-richtig-deinstallieren/</link>
		<comments>http://www.jannikegger.com/2011/08/15/xcode-richtig-deinstallieren/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 13:13:10 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[Allgemeine Tipps]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[deintallieren]]></category>
		<category><![CDATA[OSX 10.6.8]]></category>
		<category><![CDATA[OSX Lion]]></category>
		<category><![CDATA[Xcode 4.1]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=307</guid>
		<description><![CDATA[Problem: Noch vor meinem Urlaub hatte ich unter OSX 10.6 Xcode als Final Build und als Beta-Version installiert. Nach dem Upgrade auf OSX Lion ging nichts mehr. Ich konnte weder bestehende Projekte öffnen oder neue Projekte anlegen. Da war was richtig kaputt. Eine Neuinstallation von Xcode war die Lösung. Wie das richtig gemacht wird, seht [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem:</strong> Noch vor meinem Urlaub hatte ich unter OSX 10.6 Xcode als Final Build und als Beta-Version installiert. Nach dem Upgrade auf OSX Lion ging nichts mehr. Ich konnte weder bestehende Projekte öffnen oder neue Projekte anlegen. Da war was richtig kaputt. Eine Neuinstallation von Xcode war die Lösung. Wie das richtig gemacht wird, seht ihr hier.</p>
<p><strong><span id="more-307"></span>Lösung:</strong> Zur erfolgreichen deinstallation benötigtig ihr das Terminal. Um die Devtools deintallieren zu können gebt Ihr folgenden Befehl ein:</p>
<pre class="brush: plain; title: ; notranslate">
sudo /Developer/Library/uninstall-devtools --mode=all
</pre>
<p>Nachdem Ihr diesen Code Ausgeführt habt müsst Ihr euer Adminpasswort eingeben. So könnt Ihr den Befehl als &#8220;sudo&#8221;-Benutzer ausführen.<br />
Die Deinstallation dauert nun eine weile. Geht euch kurz einen Kaffee machen&#8230;</p>
<p>Ist das Script und euer Kaffee erfolgreich durchgelaufen solltet Ihr noch die weiteren Einstellung von Xcode löschen, so könnt Ihr sicher sein das wirklich alles entfernt wurde.</p>
<pre class="brush: plain; title: ; notranslate">
rm ~/Library/Preferences/com.apple.Xcode.plist
rm ~/Library/Preferences/com.apple.InterfaceBuilder3.plist
rm ~/Library/Preferences/com.apple.Instruments.plist
</pre>
<p>Solltet Ihr nun die neuste Version von Xcode installieren wollen ist ein neustart eures Mac`s notwendig!<br />
Gutes gelingen und viel spaß beim programmieren <img src='http://www.jannikegger.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/08/15/xcode-richtig-deinstallieren/feed/rss2/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TYPO3 &#8211; Fluid if-condition und Stringvergleich</title>
		<link>http://www.jannikegger.com/2011/07/06/typo3-fluid-if-condition-und-stringvergleich/</link>
		<comments>http://www.jannikegger.com/2011/07/06/typo3-fluid-if-condition-und-stringvergleich/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 14:19:34 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[Extbase & Fluid]]></category>
		<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[<if:]]></category>
		<category><![CDATA[Extbase]]></category>
		<category><![CDATA[Fluid]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=298</guid>
		<description><![CDATA[Problem: In der aktuellen Fluid Version lassen sich bisher, in IF-Abfragen, noch keine Stringvergleiche durchführen. Dies ist im Produktiveinsatz eine starke Behinderung. In manchen Büchern wird darauf hingewiesen das Stringvergleiche aufgrund ihrer komplizierten Implementierung bisher nicht möglich sind und man daher auf einen ViewHelper zurückgreifen sollte. Das sehe ich nicht so! Eine alternative Lösung folgt. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem: </strong>In der aktuellen Fluid Version lassen sich bisher, in IF-Abfragen, noch keine Stringvergleiche durchführen. Dies ist im Produktiveinsatz eine starke Behinderung. In manchen Büchern wird darauf hingewiesen das Stringvergleiche aufgrund ihrer komplizierten Implementierung bisher nicht möglich sind und man daher auf einen ViewHelper zurückgreifen sollte.<br />
Das sehe ich nicht so! Eine alternative Lösung folgt.<span id="more-298"></span></p>
<p><strong>Lösung: </strong>Die Lösung zu dem Problem ist sehr einfach. Stringvergleiche sind derzeit nicht möglich, was jedoch verglichen werden kann, sind Arrays.<br />
Um nun einen String zu vergleichen müsst Ihr lediglich folgende abfrage durchführen.</p>
<pre class="brush: objc; title: ; notranslate">
&lt;f:if condition=&quot;{0: key} == {0: 'meinString'}&quot;&gt;
&lt;f:then&gt;
Holla
&lt;/f:then&gt;
&lt;f:else&gt;
die Waldfee
&lt;/f:else&gt;
&lt;/f:if&gt;
</pre>
<p>Ich hoffe euch hilft das so sehr wie mir <img src='http://www.jannikegger.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/07/06/typo3-fluid-if-condition-und-stringvergleich/feed/rss2/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac &#8211; Im Finder die Ordnergrößen anzeigen</title>
		<link>http://www.jannikegger.com/2011/06/14/mac-im-finder-die-ordnergrosen-anzeigen/</link>
		<comments>http://www.jannikegger.com/2011/06/14/mac-im-finder-die-ordnergrosen-anzeigen/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 08:41:38 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[Allgemeine Tipps]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=287</guid>
		<description><![CDATA[Problem: Da akteull das Volumen meiner Backupfestplatte, für das anstehende Update, nicht ausreicht war ich auf der Suche nach großen Ordner auf meinem Mac. Der Mac-Finder zeigt jedoch in der Listendarstellung keine Ordnergrößen an. Lösung: Die Lösung des Problems ist sehr einfach. Geht mit dem Finder einfach in den gewünschten Ordner. Die Tastenkombinatiom cmd+j öffnet [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem:</strong> Da akteull das Volumen meiner Backupfestplatte, für das anstehende Update, nicht ausreicht war ich auf der Suche nach großen Ordner auf meinem Mac. Der Mac-Finder zeigt jedoch in der Listendarstellung keine Ordnergrößen an.<strong></strong></p>
<p><strong><span id="more-287"></span>Lösung:</strong> Die Lösung des Problems ist sehr einfach. Geht mit dem Finder einfach in den gewünschten Ordner. Die Tastenkombinatiom cmd+j öffnet euch ein Fenster für diverse Ordnereinstellungen. Einer der Einstellungsmöglichkeiten ist der Punkt &#8220;Alle Größen berechnen&#8221;. Aktiviert Ihr diesen, zeigt euch der Finder auch die Ordnergröße an.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/06/14/mac-im-finder-die-ordnergrosen-anzeigen/feed/rss2/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UIFont &#8211; auslesen der &#8220;fontNames&#8221;</title>
		<link>http://www.jannikegger.com/2011/05/28/uifont-auslesen-der-fontnames/</link>
		<comments>http://www.jannikegger.com/2011/05/28/uifont-auslesen-der-fontnames/#comments</comments>
		<pubDate>Sat, 28 May 2011 08:37:51 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[iPhone Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[fontWithName]]></category>
		<category><![CDATA[UIFont]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=273</guid>
		<description><![CDATA[Problem: Ihr wollt für ein Label, einen Button oder für eine andere Komponente eine Schrift definieren. Klar, in Photoshop nennen sich die Schrift &#8220;Helvetica Neue&#8221; etc.. Doch welche Angabe erwartet beispielsweise [UIFont fontWithName:@"XXX" size:14.0]; ? In dem kommenden Beispiel werde ich euch einen praktischen Tipp zeigen. Lösung: Um die Wahl des richtigen Schriftnamens zu erleichtern, gibt [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem:</strong> Ihr wollt für ein Label, einen Button oder für eine andere Komponente eine Schrift definieren. Klar, in Photoshop nennen sich die Schrift &#8220;Helvetica Neue&#8221; etc.. Doch welche Angabe erwartet beispielsweise [UIFont fontWithName:@"XXX" size:14.0]; ? In dem kommenden Beispiel werde ich euch einen praktischen Tipp zeigen.</p>
<p><span id="more-273"></span><strong>Lösung: </strong> Um die Wahl des richtigen Schriftnamens zu erleichtern, gibt es diese zwei Codesnippets.<br />
Der erste Snippet liefert euch alle Schriften, welche UIFont kennt (eigens implementierte Schriften sind dort nicht enthalten).</p>
<pre class="brush: objc; title: ; notranslate">
NSLog(@&quot;[UIFont familyNames]: %@&quot;, [UIFont familyNames]);
</pre>
<p>Die Ausgabe in der Console sieht wie folgt aus:</p>
<pre class="brush: objc; title: ; notranslate">&lt;/span&gt;
&lt;pre&gt;2011-05-28 10:31:29.436 fontnames[18819:207] [UIFont familyNames]: (
    Thonburi,
    &quot;Snell Roundhand&quot;,
    &quot;Academy Engraved LET&quot;,
    &quot;Marker Felt&quot;,
    &quot;Geeza Pro&quot;,
    &quot;Arial Rounded MT Bold&quot;,
    &quot;Trebuchet MS&quot;,
    Arial,
    &quot;Gurmukhi MN&quot;,
    &quot;Malayalam Sangam MN&quot;,
    &quot;Bradley Hand&quot;,
    &quot;Kannada Sangam MN&quot;,
    &quot;Bodoni 72 Oldstyle&quot;,
    Cochin,
    &quot;Sinhala Sangam MN&quot;,
    &quot;Hiragino Kaku Gothic ProN&quot;,
    Papyrus,
    Verdana,
    &quot;Zapf Dingbats&quot;,
    Courier,
    &quot;Hoefler Text&quot;,
    Helvetica,
    &quot;Hiragino Mincho ProN&quot;,
    &quot;Bodoni Ornaments&quot;,
    &quot;Apple Color Emoji&quot;,
    Optima,
    &quot;Gujarati Sangam MN&quot;,
    &quot;Devanagari Sangam MN&quot;,
    &quot;Times New Roman&quot;,
    Kailasa,
    &quot;Telugu Sangam MN&quot;,
    &quot;Heiti SC&quot;,
    Futura,
    &quot;Bodoni 72&quot;,
    Baskerville,
    &quot;Chalkboard SE&quot;,
    &quot;Heiti TC&quot;,
    Copperplate,
    &quot;Party LET&quot;,
    &quot;American Typewriter&quot;,
    AppleGothic,
    &quot;Bangla Sangam MN&quot;,
    Noteworthy,
    Zapfino,
    &quot;Tamil Sangam MN&quot;,
    &quot;DB LCD Temp&quot;,
    &quot;Arial Hebrew&quot;,
    &quot;Heiti K&quot;,
    Georgia,
    &quot;Heiti J&quot;,
    &quot;Helvetica Neue&quot;,
    &quot;Gill Sans&quot;,
    Chalkduster,
    Palatino,
    &quot;Courier New&quot;,
    &quot;Oriya Sangam MN&quot;,
    Didot,
    &quot;Bodoni 72 Smallcaps&quot;
)
</pre>
<p>Das sind einige Schriften. Wenn Ihr den richtigen FontName gefunden habt, könnt Ihr die Schriftvariationen (<strong>bold, </strong><em>italic </em>etc.) laden. Das geht so:</p>
<pre class="brush: objc; title: ; notranslate">
NSLog(@&quot;[UIFont fontNamesForFamilyName:fontFamilyName]: %@&quot;,[UIFont fontNamesForFamilyName:@&quot;Tamil Sangam MN&quot;]);
</pre>
<p>Die Consoleausgabe liefert folgendes:</p>
<pre class="brush: objc; title: ; notranslate">
2011-05-28 10:31:29.438 fontnames[18819:207] [UIFont fontNamesForFamilyName:fontFamilyName]: (
    TamilSangamMN,
    &quot;TamilSangamMN-Bold&quot;
)</pre>
<p>Hoffentlich hilft das dem Einen oder Anderen weiter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/05/28/uifont-auslesen-der-fontnames/feed/rss2/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UIColor mit HEX- / RGB-Wert erstellen</title>
		<link>http://www.jannikegger.com/2011/05/01/uicolor-mit-hex-rgb-wert-erstellen/</link>
		<comments>http://www.jannikegger.com/2011/05/01/uicolor-mit-hex-rgb-wert-erstellen/#comments</comments>
		<pubDate>Sun, 01 May 2011 17:26:29 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[iPhone Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[UIColor]]></category>
		<category><![CDATA[UIColor colorWithRed: green: blue:]]]></category>
		<category><![CDATA[UIColor HEX]]></category>
		<category><![CDATA[UIColor RGB]]></category>

		<guid isPermaLink="false">http://www.jannikegger.com/?p=172</guid>
		<description><![CDATA[Problem: Wer kennt das nicht, ihr programmiert eine View und alles sieht gut aus. Nun kommt euer Designer und sagt: &#8220;Bei dem Titel-Label stimmt die Farbe nicht, das müsste eigentlich folgender HEX-Code sein&#8230;&#8221;. Spätestens jetzt geht die Rechnerei los, um die HEX-Codes in das passende Format für &#8220;[UIColor colorWithRed:...]&#8221; umzurechnen. Lösung: Damit ihr euch in [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem:</strong> Wer kennt das nicht, ihr programmiert eine View und alles sieht gut aus. Nun kommt euer Designer und sagt: &#8220;Bei dem Titel-Label stimmt die Farbe nicht, das müsste eigentlich folgender HEX-Code sein&#8230;&#8221;. Spätestens jetzt geht die Rechnerei los, um die HEX-Codes in das passende Format für &#8220;[UIColor colorWithRed:...]&#8221; umzurechnen.<span id="more-172"></span></p>
<p><strong>Lösung:</strong> Damit ihr euch in Zukunft diese aufwendige und zeitraubende Arbeit sparen könnt, stelle ich euch heute mein &#8220;Macro des Tages&#8221; vor.<br />
Dieses definiert ihr einfach in der &#8220;Prefix.pch&#8221;-Datei aus eurem Projekt, so könnt ihr das Macro in jeder Klasse eures Projekts verwenden.</p>
<pre class="brush: objc; title: ; notranslate">
#define UIColorFromHEX(rgbValue) [UIColor colorWithRed:((float)((rgbValue &amp; 0xFF0000) &gt;&gt; 16))/255.0 green:((float)((rgbValue &amp; 0xFF00) &gt;&gt; 8))/255.0 blue:((float)(rgbValue &amp; 0xFF))/255.0 alpha:1.0]
</pre>
<p>Verwendet wird das Macro folgendermaßen und liefert euch ein UIColor-Object zurück.</p>
<pre class="brush: objc; title: ; notranslate">
testLabel.textColor = UIColorFromHEX(0x9f9f9f);
</pre>
<p>Hoffentlich könnt ihr den Codesnippet auch so gut gebrauchen wie ich es tue.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/05/01/uicolor-mit-hex-rgb-wert-erstellen/feed/rss2/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iOS &#8211; Validierung einer URL mit NSPredicate</title>
		<link>http://www.jannikegger.com/2011/04/29/ios-validierung-einer-url-mit-nspredicate/</link>
		<comments>http://www.jannikegger.com/2011/04/29/ios-validierung-einer-url-mit-nspredicate/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 13:39:17 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[iPhone Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[NSPredicate]]></category>
		<category><![CDATA[NSUrl]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[URL Validierung]]></category>

		<guid isPermaLink="false">http://jannikegger.com/?p=130</guid>
		<description><![CDATA[Problem: Validierung eines URL-Strings. Lösung: Die Validierung einer URL kann sehr aufwendig sein. Da ich gerade eine neue App entwickle, welche viele URL`s bearbeiten muss,  habe ich eine Funktion geschrieben, die eine URL (vorliegend als NSString) unter Verwendung von NSPredicate validiert. Übergeben wird lediglich der String, als Rückgabewert erhalten wir TRUE oder FALSE. Die Funktion [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem</strong>: Validierung eines URL-Strings.<br />
<strong>Lösung: </strong>Die Validierung einer URL kann sehr aufwendig sein. Da ich gerade eine neue App entwickle, welche viele URL`s bearbeiten muss,  habe ich eine Funktion geschrieben, die eine URL (vorliegend als NSString) unter Verwendung von NSPredicate validiert. Übergeben wird lediglich der String, als Rückgabewert erhalten wir TRUE oder FALSE.<span id="more-130"></span><br />
Die Funktion kann ab iOS 3.0 verwendet werden.</p>
<pre class="brush: objc; title: ; notranslate">
- (BOOL) validateMyUrl:(NSString *)_url {
 NSString *regEx = @&quot;(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+&quot;;
 NSPredicate *validate = [NSPredicate predicateWithFormat:@&quot;SELF MATCHES %@&quot;, regEx];
 return [validate evaluateWithObject:_url];
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/04/29/ios-validierung-einer-url-mit-nspredicate/feed/rss2/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hintergrund einer UINavigationBar anpassen</title>
		<link>http://www.jannikegger.com/2011/04/26/uinavigationbar-hintergrund-anpassen/</link>
		<comments>http://www.jannikegger.com/2011/04/26/uinavigationbar-hintergrund-anpassen/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 12:27:16 +0000</pubDate>
		<dc:creator>Jannik Egger</dc:creator>
				<category><![CDATA[Angepasstes Interface]]></category>
		<category><![CDATA[iPhone Programmierung]]></category>
		<category><![CDATA[angepasste UINavigationBar]]></category>
		<category><![CDATA[custom background]]></category>
		<category><![CDATA[custom UINavigationBar]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[hintergrundbild anpassen]]></category>
		<category><![CDATA[UINavigationBar]]></category>

		<guid isPermaLink="false">http://jannikegger.com/?p=53</guid>
		<description><![CDATA[Problem: Viele iOS Apps haben eine angepasste und oft aufwändig entiwckelte GUI. So müssen auch standard Elemente, wie die UINavigationBar, grafisch angepasst werden. iBooks und Notizen sind seitens Apple die bekanntesten Beispiele für eine angepasste NavigationBar. Wie eine solche Anpassung realisiert wird erkläre ich euch anhand dem kommenden Beispiel. Vorbereitung: Um mit unserem Beispiel starten [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problem: </strong>Viele iOS Apps haben eine angepasste und oft aufwändig entiwckelte GUI. So müssen auch standard Elemente, wie die UINavigationBar, grafisch angepasst werden. iBooks und Notizen sind seitens Apple die bekanntesten Beispiele für eine angepasste NavigationBar. Wie eine solche Anpassung realisiert wird erkläre ich euch anhand dem kommenden Beispiel.<span id="more-53"></span></p>
<p><strong>Vorbereitung: </strong>Um mit unserem Beispiel starten zu können benötigen wir ein lauffähiges App. Dazu legt Ihr einfach ein neues Projekt auf Basis des &#8220;Navigation-Based&#8221; Templates an und fügt einen &#8220;DetailView&#8221; hinzu.<br />
Zu diesem Zeitpunkt sollte eure App funktionsfähig sein und so ähnlich aussehen wie die folgenden Bilder.</p>
<p><strong><span style="font-weight: normal"> <a href="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-11-um-18.09.05.png" rel="lightbox[53]"><img class="alignnone size-medium wp-image-69" src="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-11-um-18.09.05-159x300.png" alt="" width="159" height="300" /></a><a href="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-11-um-18.09.11.png" rel="lightbox[53]"><img class="alignnone size-medium wp-image-70" src="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-11-um-18.09.11-159x300.png" alt="" width="159" height="300" /></a></span></strong></p>
<p><strong>Lösung: <span style="font-weight: normal">Der nächste Schritt zur eigenen UINavigationBar ist die Erstellung einer eigenen Subclass der UINavigationBar. Dies machen wir, indem wir eine neue Datei anlegen und als Template wählen wir &#8220;Objective-C class&#8221;.<br />
Aus dem Drop-Down für die &#8220;Subclass&#8221; selektieren wir NSObject. Als Dateiname geben wir <strong><em>&#8220;CustomUINavigationBar&#8221; <span style="font-weight: normal"><span style="font-style: normal">an</span></span></em><span style="font-weight: normal">.</span></strong><br />
Da es hier keine Vorlage für eine UINavigationBar gibt, werden wir die Umstellung manuell vornehmen, das geht sehr einfach.<br />
Wir müssen lediglich in den neu erstellten Dateien </span><span style="font-weight: normal"><em>&#8220;NSObject&#8221; </em><span style="font-weight: normal">durch </span><em>&#8220;UINavigationBar&#8221; </em><span style="font-weight: normal">ersetzen.</span></span><span style="font-weight: normal"> </span></strong></p>
<pre class="brush: objc; title: ; notranslate">
// Alt
@interface CustomUINavigationBar : NSObject {...}
// Neu
@interface CustomUINavigationBar : UINavigationBar {...}
</pre>
<p>Ist die neue Subclass gesetzt, müssen wir noch eine neue Property definieren. Diese Property benötigen wir, um sie gleich im Interface Builder verknüpfen zu können. Den Code, den wir nun benötigen, sieht wie folgt aus:</p>
<pre class="brush: objc; title: ; notranslate">
// CustomUINavigationBar.h
@interface CustomUINavigationBar : UINavigationBar{
  IBOutlet UINavigationController* navigationController;
}

@property (nonatomic, retain) IBOutlet UINavigationController* navigationController;

@end
</pre>
<pre class="brush: objc; title: ; notranslate">
// CustomUINavigationBar.m
#import &quot;CustomUINavigationBar.h&quot;

@implementation CustomUINavigationBar
@synthesize navigationController;

- (void)dealloc{
  [navigationController release];
  [super dealloc];
}

@end
</pre>
<p>Sobald die neue Subclass und das Outlet (Property) definiert ist, öffnen wir das &#8220;MainWindow.xib&#8221; im InterfaceBuilder.<br />
Dort klappen wir den UINavigationController auf (um dies machen zu können solltet Ihr euch im Listen Modus befinden). Innerhalb des &#8220;UINavigationControllers&#8221; findet Ihr eine &#8220;UINavigationBar&#8221;, genau diese wird von uns benötigt.<br />
Mit einem Klick wählen wir die NavigationBar aus und öffnen den &#8220;Identity-Inspector&#8221; (Shortcut: ⌘+4). Ist dieser geöffnet, finden wir dort ein Feld &#8220;Class-Identity&#8221;, hier geben wir nun unsere &#8220;CustomUINavigationBar&#8221; an.<br />
<a href="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-12-um-11.17.20.png" rel="lightbox[53]"><img class="alignnone size-medium wp-image-87" src="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-12-um-11.17.20-300x162.png" alt="" width="300" height="162" /></a></p>
<p>Nach dieser Zuweisung fehlt uns nur noch eine Sache im Interface Builder. Dazu wechseln wir in den Tab &#8220;Connections&#8221; (Shortcut: ⌘+2), hier können wir das Outlet des NavigationController  zuweisen. Dies machen wir per Drag&amp;Drop (siehe nächstes Bild).<br />
<a href="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-12-um-11.25.47.png" rel="lightbox[53]"><img class="alignnone size-medium wp-image-88" src="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-12-um-11.25.47-300x162.png" alt="" width="300" height="162" /></a></p>
<p>An dieser Stelle sind die Arbeiten im Interface Builder abgeschlossen.<br />
Wir sollten nun alle Dateien speichern, Interface Builder beenden und zurück zu Xcode wechseln. Da unsere Subclass aktuell keine Funktionen hat bzw. überschrieben ist, ist  unsere App auch an dieser Stelle lauffähig (jedoch sehen wir noch keine Veränderungen in der NavigationBar).</p>
<p>Zurück in XCode öffnen wir die Datei <em>&#8220;CustomUINavigationBar.h&#8221;.</em><br />
Hier müssen wir nun eine weitere Property und zwei neue Funktionen definieren.<br />
Zum einen definieren wir eine Property für unser neues Hintergrundbild (<em>UIImageView *backgroundImageView</em>) und zwei Funktionen zum Hinzufügen und entfernen des Hintergrundbildes.<br />
Unser Code in <em>&#8220;CustomUINavigationBar.h&#8221; </em>sieht nun wie folgt aus.</p>
<pre class="brush: objc; title: ; notranslate">
@interface CustomUINavigationBar : UINavigationBar {
  UIImageView *backgroundImageView;
  IBOutlet UINavigationController *navigationController;
}

@property (nonatomic, retain) UIImageView *backgroundImageView;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

-(void) setBackgroundImage:(UIImage*)backgroundImage;
-(void) clearBackgroundImageView;

@end
</pre>
<p>Die <em>&#8220;CustomUINavigationBar.m&#8221;</em> sieht vorerst so aus:</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;CustomUINavigationBar.h&quot;

@implementation CustomUINavigationBar
@synthesize backgroundImageView, navigationController;

-(void) setBackgroundImage:(UIImage*)backgroundImage {
}

-(void) clearBackgroundImageView {
}

- (void) dealloc {
  [backgroundImageView release];
  [navigationController release];
  [super dealloc];
}

@end
</pre>
<p>Zusätzlich zu diesen Funktionen benötigen wir noch die Funktion <em>&#8220;drawRect:(CGRect)rect&#8221;.</em> Diese Funktion zeichnet unser <em>&#8220;backgroundImageView&#8221; </em>als Hintergrundbild unserer NavigationBar, dies soll aber nur geschehen, wenn wir auch wirklich ein Hintergrundbild haben.<br />
Die Implementierung der Funktion sieht wie folgt aus:</p>
<pre class="brush: objc; title: ; notranslate">
- (void) drawRect:(CGRect)rect {
  if (backgroundImageView) {
    [backgroundImageView.image drawInRect:rect];
  } else {
    [super drawRect:rect];
  }
}
</pre>
<p>Kommen wir nun zu der Funktion die uns das Hintergrundbild setzt. In diese Funktion übergeben wir ein UIImage. In der ersten Zeile der Funktion erstellen wir eine neue Instanz von UIImageView. In der nächsten Zeile setzten wir das übergebene Bild als Image unseres UIImageView`s. In der letzten Zeile rufen wir &#8220;setNeedsDisplay&#8221; auf, diese Funktion erzwingt das die NavigationBar neu gezeichnet wird und ruft die von uns überschrieben &#8220;drawRect&#8221; auf.<br />
Somit wird unser Hintergrundbild erstellt und &#8220;eingefügt&#8221;.</p>
<pre class="brush: objc; title: ; notranslate">
-(void) setBackgroundImage:(UIImage*)backgroundImage {
    self.backgroundImageView = [[[UIImageView alloc] initWithFrame:self.frame] autorelease];
    backgroundImageView.image = backgroundImage;
    [self setNeedsDisplay];
}
</pre>
<p>Die Funktion <em>&#8220;clearBackgroundImageView&#8221;</em> ist recht einfach, denn dort setzten wir unsere <em>&#8220;backgroundImageView&#8221;</em> Property lediglich auf &#8220;nil&#8221; und erzwingen durch den Aufruf von &#8220;setNeedsDisplay&#8221; das unsere NavigationBar neu gezeichnet wird. Da unser Hintergrundbild zu diesem Zeitpunkt nicht vorhanden ist, wird in &#8220;drawRect&#8221; die &#8220;originale / super drawRect&#8221; der NavBar aufgerufen.</p>
<pre class="brush: objc; title: ; notranslate">
-(void) clearBackgroundImageView {
  self.backgroundImageView = nil;
  [self setNeedsDisplay];
}
</pre>
<p>Nun kommen wir zur Implementierung unserer Funktionen. Dazu wechselt Ihr in euren &#8220;RootViewController.m&#8221;, importiert die &#8220;CustomUINavigationBar.h&#8221; und geht in die Funktion &#8220;viewDidLoad&#8221;, dort ergänzen wir nun folgende zwei Zeilen:</p>
<pre class="brush: objc; title: ; notranslate">
CustomUINavigationBar* customUINavigationBar = (CustomUINavigationBar*)self.navigationController.navigationBar;
[customUINavigationBar setBackgroundImage:[UIImage imageNamed:@&quot;NavigationBarBackground.png&quot;]];
</pre>
<p>In Zeile 1 holen wir die NavigationBar unseres NavControllers. Da dieser vom Typ &#8220;CustomUINavigationController&#8221; ist wenden wir auch ein Typecast an. Zeile 2 beschäftigt sich nun mit dem Aufruf unserer &#8220;setBackgroundImage&#8221; Funktion. Das war auch schon der ganze Zauber, im Ergebnis sieht das ganz dann so aus:<br />
<a href="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-15-um-08.50.00.png" rel="lightbox[53]"><img class="alignnone size-medium wp-image-114" src="http://jannikegger.com/wp-content/uploads/2011/02/Bildschirmfoto-2011-02-15-um-08.50.00-159x300.png" alt="" width="159" height="300" /></a></p>
<p>Damit die zwei Buttons etwas besser in den neuen Hintergrund passen, könnt Ihr einfach die &#8220;tintColor&#8221; der NavigationBar anpassen. Dies verändert nicht nur die Farbe der NavigationBar, sondern auch die Farbe eurer Buttons&#8230;</p>
<pre class="brush: objc; title: ; notranslate">
customUINavigationBar.tintColor = [UIColor greyColor];
</pre>
<p><a href="http://www.jannikegger.com/wp-content/uploads/2011/04/Bildschirmfoto-2011-04-30-um-08.56.39.png" rel="lightbox[53]"><img src="http://www.jannikegger.com/wp-content/uploads/2011/04/Bildschirmfoto-2011-04-30-um-08.56.39-159x300.png" alt="" width="159" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jannikegger.com/2011/04/26/uinavigationbar-hintergrund-anpassen/feed/rss2/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

