<?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>Roger Boesch &#187; Programming</title>
	<atom:link href="http://www.rogerboesch.com/category/dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rogerboesch.com</link>
	<description>iPhone, iPad und iPod Touch</description>
	<lastBuildDate>Thu, 01 Apr 2010 20:04:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>XCode Header Kommentar</title>
		<link>http://www.rogerboesch.com/2010/03/25/xcode-header-kommentar/</link>
		<comments>http://www.rogerboesch.com/2010/03/25/xcode-header-kommentar/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 12:28:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Tip of the week]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=944</guid>
		<description><![CDATA[Erstellt man in XCode neue Klassen, dann wird im Header automatisch ein Eintrag im Stil von
Copyright (c) 2010 MyCompanyName. All rights reserved.
erzeugt. Bis zur Version 3.2 war eine einfache Änderung dieses Firmennamens nicht möglich. In Version 3.2 von XCode findet sich nun aber endlich eine Funktion, um dies direkt aus der IDE heraus zu änden. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/comp1.png" rel="lightbox[944]"><img class="alignright size-medium wp-image-945" title="comp1" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/comp1-300x210.png" alt="" width="300" height="210" /></a>Erstellt man in XCode neue Klassen, dann wird im Header automatisch ein Eintrag im Stil von</p>
<p><em>Copyright (c) 2010 MyCompanyName. All rights reserved.</em></p>
<p>erzeugt. Bis zur Version 3.2 war eine einfache Änderung dieses Firmennamens nicht möglich. In Version 3.2 von XCode findet sich nun aber endlich eine Funktion, um dies direkt aus der IDE heraus zu änden. Interessant ist, dass man das pro Proekt ändern kann, was insbesondere ein nützliches Fetaure ist, wenn im Kundenauftrag arbeitet. Um das zu bewerkstelligen, einfach mit der rechten Maustaste den Projekteintrag selektieren, Get Info drücken und dann den Firmennamen unter General Settings wechseln.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/25/xcode-header-kommentar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XNA Game Studio 4.0 auf MacBook Pro</title>
		<link>http://www.rogerboesch.com/2010/03/17/xna-game-studio-4-0-auf-macbook-pro/</link>
		<comments>http://www.rogerboesch.com/2010/03/17/xna-game-studio-4-0-auf-macbook-pro/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 11:51:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=936</guid>
		<description><![CDATA[Seit Anfang der Woche ist XNA Game Studio 4.0 als Teil des Windows Phone 7 CTP&#8217;s verfügbar. Dieses beinhaltet:

Visual Studio 2010 Express for Windows Phone
Windows Phone 7 Series Add-in for Visual Studio
Windows Phone 7 Series emulator
XNA Game Studio 4.0

Klar, dass bei mir alles auf einem Apple Rechner laufen muss. Erste Tests mit VMWare Fusion waren [...]]]></description>
			<content:encoded><![CDATA[<p>Seit Anfang der Woche ist XNA Game Studio 4.0 als Teil des <a title='Original Link: http://developer.windowsphone.com'  href="http://www.rogerboesch.com/?PvhHG58s">Windows Phone 7 CTP</a>&#8217;s verfügbar. Dieses beinhaltet:</p>
<ul>
<li>Visual Studio 2010 Express for Windows Phone</li>
<li>Windows Phone 7 Series Add-in for Visual Studio</li>
<li>Windows Phone 7 Series emulator</li>
<li>XNA Game Studio 4.0</li>
</ul>
<p>Klar, dass bei mir alles auf einem Apple Rechner laufen muss. Erste Tests mit VMWare Fusion waren durchaus befriediegend, allerdings lediglich für Windows Phone 7 Apps. XNA selber stellt höhrere Anforderungen an die Hardware, so z.B. eine Grafikkarte mit DirectX 10 Unterstützung. Fast alle aktuellen Macs, verfügen über DirectX 10.0 fähige Grafikkarten. So war der nächste Schritt (wieder einmal) Bootcamp mit Windows 7 auf einem MacBook Pro zu instalieren, CTP drauf und leider grosse Entäuschung. XNA funktioniert nicht, trotz einer NVidia GeForce 9600 M GT. Das aktuellste DirectX (Februar 2010) ist ebenfalls drauf und im Caps Viewer sieht man, dass die Karte selber eigentlich alle Anforderungen erfüllt. Somit bleibt nur noch der Treiber selber als Ursache übrig. Dieser stammt bei meiner Bootcamp Installation von der aktuellen Snow Leopard CD. Auf den Seiten von Nvidia gab&#8217;s aber einen aktuelleren Treiber, der sich einwandfrei installieren liess und zum Erfolg geführt hat. XNA in der Version 4.0 läuft nun auf meinem Mac, so dass der nächste Beitrag ein erstes kleines Game zum Inhalt haben wird!</p>
<p>Hinweis: Auf <a title='Original Link: http://klucher.com/blog/xna-game-studio-and-windows-phone-emulator-compatibility/'  href="http://www.rogerboesch.com/?SAbHhMtW">Michael Kluchers XNA Blog</a> gibts übrigens auch einen guten Artikel zu dem &#8220;Problem&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/17/xna-game-studio-4-0-auf-macbook-pro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Simulator und ABAdressBook</title>
		<link>http://www.rogerboesch.com/2010/03/17/iphone-simulator-und-abadressbook/</link>
		<comments>http://www.rogerboesch.com/2010/03/17/iphone-simulator-und-abadressbook/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 09:11:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[AdressBook]]></category>
		<category><![CDATA[Code snippet]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tip of the week]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=930</guid>
		<description><![CDATA[Die Integration des Adressbuchs in eigene Apps ist eine schöne Sache. Während der Entwicklung im Simulator stellt sich leider meistens heraus, dass das Adressbuch entweder ganz leer ist oder sich nur wenige Datensätze darin befinden. Hat man im Simulator einmal auf Reset gedrückt sind die Daten meistens ganz weg. Was liegt also näher, als die [...]]]></description>
			<content:encoded><![CDATA[<p>Die Integration des Adressbuchs in eigene Apps ist eine schöne Sache. Während der Entwicklung im Simulator stellt sich leider meistens heraus, dass das Adressbuch entweder ganz leer ist oder sich nur wenige Datensätze darin befinden. Hat man im Simulator einmal auf Reset gedrückt sind die Daten meistens ganz weg. Was liegt also näher, als die Daten des Adressbuchs vom eigenen iPhone auch für die Tests im Simulator zu nutzen, was gar nicht mal so kompliziert ist. Die nachfolgenden Schritte zeigen wie&#8217;s geht:</p>
<p>Wichtig ist natürlich, dass sich auf dem Mac auf dem die nachfolgenden Commands ausgeführt werden, auch wirklich ein Backup befindet&#8230;</p>
<ol>
<li><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/createdb.zip">Zip file</a> downloaden und im Home Verzeichnis entpacken</li>
<li>Terminal App öffnen</li>
<li>Setzen der Dateiattribute: <em>chmod u=x createdb</em></li>
<li>Ausfuhren der Datei mit: <em>./createdb</em></li>
<li>Fertig!</li>
</ol>
<p><strong>Anmerkung</strong>: Je nach SDK kann es jetzt noch sein, dass man im Finder die Datei <em>/Users/admin/Library/Application Support/iPhone Simulator/User/Library/AddressBook/AddressBook.sqlitedb</em> auch noch in die anderen Verzeichnisse (also z.B. <em>/Users/admin/Library/Application Support/iPhone  Simulator/3.1.3/Library/AddressBook/AddressBook.sqlitedb</em>) kopieren muss, was aber wieder im Finder geschehen kann.</p>
<h6><em>Btw.: Das Script habe ich übrigens nicht ganz selber geschrieben, sondern vor einiger Zeit mal irgendwo gefunden und angepasst. Wenn ich den Link wieder finde füge ich ihn noch an.</em></h6>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/17/iphone-simulator-und-abadressbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Phone 7 und XNA</title>
		<link>http://www.rogerboesch.com/2010/03/15/windows-phone-7-und-xna/</link>
		<comments>http://www.rogerboesch.com/2010/03/15/windows-phone-7-und-xna/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 23:30:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=921</guid>
		<description><![CDATA[Die neue Windos Phone Series 7 von Microsoft wurde ja bereits Anfang des Jahres vorgestellt, jetzt gibts endlich detailliertere Informationen dazu, wie&#8217;s von Entwicklerseite ausschaut. Nicht schlecht, wie man neidlos zugeben muss. Insbesondere XNA und Silverlight als tragende Säulen für den Entwickler zur Verfügung zu stellen, dürfte einen ziemlichen Boom an (guten) Applikationen nach sich [...]]]></description>
			<content:encoded><![CDATA[<p>Die neue Windos Phone Series 7 von Microsoft wurde ja bereits Anfang des Jahres vorgestellt, jetzt gibts endlich detailliertere Informationen dazu, wie&#8217;s von Entwicklerseite ausschaut. Nicht schlecht, wie man neidlos zugeben muss. Insbesondere XNA und Silverlight als tragende Säulen für den Entwickler zur Verfügung zu stellen, dürfte einen ziemlichen Boom an (guten) Applikationen nach sich ziehen. Die hierfür notwendigen <a title='Original Link: http://developer.windowsphone.com'  href="http://www.rogerboesch.com/?PvhHG58s">Entwicklertools</a> sind (wie bei Apple) kostenlos und mit C# kommt insbesondere eine Programmiersprache zum Einsatz, die deutlich stärker verbreitet ist, als Objective-C. Man darf also gespannt sein&#8230;</p>
<p>Da ich bereits viel mit Silverlight und XNA gemacht habe in der Vergangenheit, möchte ich das Thema auch in meinem Blog (wieder) aufnehmen und mich in den nächsten Wochen zwischendurch immer mal wieder dem Thema widmen. Vorallem XNA, das als Erstes in einem Prototyp zum Einsatz kommen soll, aber dazu mehr in den kommenden Wochen&#8230;</p>
<p><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/windows-phone-xna-10-pr.jpg" rel="lightbox[921]"><img class="alignnone size-medium wp-image-927" title="windows-phone-xna-10-pr" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/windows-phone-xna-10-pr-300x180.jpg" alt="" width="300" height="180" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/15/windows-phone-7-und-xna/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Games</title>
		<link>http://www.rogerboesch.com/2010/03/06/iphone-games/</link>
		<comments>http://www.rogerboesch.com/2010/03/06/iphone-games/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 17:36:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=880</guid>
		<description><![CDATA[Mobile Spiele sind Volkssport. In allen Altersgruppen, in allen Einkommensgruppen, in allen Bildungsschichten, in Single-, Mehrpersonen- und Familienhaushalten – überall wird gespielt.
Dabei gibt es den typischen Spieler gemäss Studie nicht, denn Computerspiele werden in allen Altersschichten und &#8211; gruppen gespielt, wobei für unsere Betrachtung vorallem der sogenannte Freizeitspieler interessant ist. Mit 54% stellt er auch [...]]]></description>
			<content:encoded><![CDATA[<p>Mobile Spiele sind Volkssport. In allen Altersgruppen, in allen Einkommensgruppen, in allen Bildungsschichten, in Single-, Mehrpersonen- und Familienhaushalten – überall wird gespielt.<br />
Dabei gibt es den typischen Spieler gemäss Studie nicht, denn Computerspiele werden in allen Altersschichten und &#8211; gruppen gespielt, wobei für unsere Betrachtung vorallem der sogenannte Freizeitspieler interessant ist. Mit 54% stellt er auch die bei weitem grösste und mit<br />
Durchschnittsalter von 44 Jahren älteste Gruppe aller Videospieler dar. Angepasste Studien für mobile Spiele oder gar spezifische fürs iPhone gibt es erst Wenige, die angegebenen Zahlen dürften aber insbesondere auf dem iPhone nochmals deutlich höher ausfallen. Der Freizeitspieler ist überwiegend berufstätig und spielt nur gelegentlich. Zum Entspannen oder zum Zeitvertreib, wenn es seine vielfältigen anderen Freizeitaktivitäten, der Job oder die Familie gerade zulassen. Er ist in jeder Hinsicht gesetzt, sowohl beruflich als auch familiär. In seinem Haushalt ist ein mittleres bis gehobenes Nettoeinkommen verfügbar. Die Entscheidung zum Spielen fällt oft spontan: Auf dem Arbeitsweg, in der Mittagspause, nach dem Abendessen oder vor dem Schlafen gehen. Auch mit einem weiteren Vorurteil räumt der Freizeitspieler gründlich auf: Männer und Frauen sind in der Gruppe gleich stark vertreten. Seine bevorzugten Genres sind Fun-, Sport- oder Geschicklichkeitsspiele, nur selten greift er zu Actionspielen oder Strategie- und Fantasiespielen. Die Zeit, sich mit komplexen Spielszenarien auseinander zu setzen, hat er gar nicht. Deshalb ist es ihm wichtig, dass die Spiele eine einfache Bedienung haben und nicht zu viel geistige Anstrengung verlangen. Spiele sind für ihn ein entspannender Ausgleich zu den Herausforderungen im Berufsalltag, er geniesst die zeitvertreibende und zerstreuende Wirkung von Spielen. Spielen auf dem iPhone (iPod Touch)<br />
Der Einfluss des iPhone auf den mobilen Markt ist gewaltig. Es wurden Massen von neuen Nutzern angelockt und die Nutzung des mobilen Internets wurde erheblich erweitert. iPhone Besitzer nutzen ihr Mobiltelefon auf eine völlig andere Art und Weise als der durchschnittliche Mobilfunknutzer. Nutzungsmuster zeigen auf, dass das iPhone gern als Unterhaltungsgerät verwendet wird. Das iPhone Paket mit Browser, Nachrichtendiensten, Spielen, Musik und Filmen ist perfekt für die Zielgruppe. In den USA hat das iPhone den Markt für Handyspiele bereits umgekrempelt. Die Handys von Apple werden mit Abstand am häufigsten für den Download von Spielen genutzt. So haben im November 2009 über 70% der iPhone Nutzer schon mindestens ein Spiel heruntergeladen, während der Durchschnitt des Gesamtmarkts gerade einmal bei unglaublichen 5% liegt.</p>
<h2>Nutzen als Werbeplatform</h2>
<p>Die schwindende Wirkung von konventionellen Werbeformen verlangt nach neuen Wegen, über die Menschen effizient erreicht werden können. Werben mit Spielen ist einer dieser Wege. Games erhalten als Freizeitbeschäftigung in dreierlei Hinsicht Bedeutung für die Werbeindustrie: Aufgrund der demografischen Verbreitung, der aufmerksamkeitsstarken Wirkung und des intensiven Involvements des Spielers in die Handlung. Hinzu kommt eine hohe Aufmerksamkeit: Wer spielt, richtet seinen Fokus ausschliesslich auf die Spielhandlung. Dabei treffen Videospiele sogar den wichtigsten Werbeträger, das Fernsehen, an seiner empfindlichsten Stelle: Berufstätige spielen überwiegend zur Entspannung nach Feierabend, zur so genannten „Primetime“. Genau dann, wenn sie eigentlich für die Werbebotschaften erreichbar sein sollten. Wenn man diese Aufmerksamkeitzurückgewinnen will, kommt man also nicht umhin, mit den Werbe-Botschaften auch in Spielen und deren Umfeld präsent zu sein. Werben lässt sich dabei auf zwei unterschiedliche Weisen:</p>
<h2>Als Teil des Gameplay</h2>
<p>Wenn Marke oder Produkt zum Teil der Spielhandlung werden, ist das Involvement des Spielers am grössten. Die Wahrnehmung ist garantiert, der Spieler setzt sich intensiv mit der Marke auseinander und wird die im Spiel erlebten Emotionen mit der Marke in Verbindung bringen. Diese Werbeform ist nicht nur die effektivste, sie ist sicher auch die aufwendigste.</p>
<h2>Teil der Spieleszenerie</h2>
<p>Die Werbung, die Marke oder das Produkt tauchen im Szenario des Games auf, zum Beispiel als Bandenwerbung in einem Sportspiel. Oder aber als Getränkeautomat, Geschäftsfiliale oder einfach als Teil einer Kulisse. Spannend ist diese Werbeform vor allem, wenn sie dynamisch ins Spiel eingefügt wird und nicht statisch im Spiel integriert sein muss. So können Banden oder Billboards tagesaktuell und sogar mit regionalem Bezug platziert werden. Auf dem iPhone sind beide Arten problemlos möglich. Durch die perfekte Symbiose von grossem Display, guten Multimediainhalten und einfachem Onlinezugriff ist das iPhone schnell zum inbegriff des mobilen Spielens geworden, mit rasant wachsender Tendenz.</p>
<h2>Spielegenres, Umsetzung und Kosten</h2>
<p>Die bevorzugten Genres auf dem iPhone sind Fun-, und Geschicklichkeitsspiele, was durch den Typ des Freizeitspielers und des mobilen Nutzerverhaltens auch logisch erscheint. Hinzu kommen zwei wesentliuche Faktoren:</p>
<ul>
<li><strong>Ein schneller Einstieg: </strong>Es muss sofort erkennbar sein, um was es geht.</li>
<li><strong>Kurze Nutzungszeiten</strong>: Die durchschnittliche Spielezeit beträgt gerade einmal 5 Minuten. Unterschieden wird grundsätzlich zwischen 2D und 3D Spielen. Aus technischer Sicht ist auf dem iPhone prinzipiell beides möglich, es hat sich aber gezeigt, dass obige Bedingungen am Besten auf 2D Spiele zutreffen. Hinzu kommt, dass professionelle 3D Spiele und insbesondere die Erstellung der Assets problemlos fünfstellige Beträge erreichen können. Budgets die zumeist noch nicht zur Verfügung stehen im Bereich der mobilen Spiele. 2D Spiele haben zudem einen ganz speziellen Reiz und gehen auch besser mit den visuellen Einschräkungen und Limitation des Displays um. Hinzu kommt, dass sich viele der Spieler an Spiele aus der eigenen Kinder- und Jugendzeit erinnert fühlen. Wer kennt nicht Pac-Man, Donkey Kong, Super Mario und wie sie alle heissen&#8230;</li>
</ul>
<p>Denken auch Sie daran, ein iPhone Game zu realisieren? Dann lassen Sie uns darüber sprechen!</p>
<p><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/Scuba.png" rel="lightbox[880]"><img class="alignnone size-medium wp-image-887" title="Scuba" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/Scuba-300x162.png" alt="" width="300" height="162" /></a><a href="http://www.rogerboesch.com/wp-content/uploads/2010/03/MyIsland.png" rel="lightbox[880]"><img class="alignnone size-medium wp-image-888" title="MyIsland" src="http://www.rogerboesch.com/wp-content/uploads/2010/03/MyIsland-300x162.png" alt="" width="300" height="162" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2010/03/06/iphone-games/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoverFlow</title>
		<link>http://www.rogerboesch.com/2009/08/16/coverflow-programmieren/</link>
		<comments>http://www.rogerboesch.com/2009/08/16/coverflow-programmieren/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 16:05:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[Cover Flow]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=611</guid>
		<description><![CDATA[
Bereits Anfang des Jahres habe ich einen Blog Beitrag zum Thema Cover Flow geschrieben. Ein Thema, zu dem mich seither immer wieder Mails und Anfragen erreicht haben. Insbesondere für Entwickler, die noch nicht so lange mit Objective-C und Cocoa entwickeln ist das Thema zugegebenermassen auch nicht ganz ohne.
Möchte man einen Cover Flow in eine eigene [...]]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/zSsns24bUPo&amp;hl=en&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/zSsns24bUPo&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
Bereits Anfang des Jahres habe ich einen Blog Beitrag zum Thema Cover Flow geschrieben. Ein Thema, zu dem mich seither immer wieder Mails und Anfragen erreicht haben. Insbesondere für Entwickler, die noch nicht so lange mit Objective-C und Cocoa entwickeln ist das Thema zugegebenermassen auch nicht ganz ohne.<br />
Möchte man einen Cover Flow in eine eigene App einbauen gibt es zunächst drei Möglichkeiten:</p>
<ul>
<li> Man benutzt den Cover Flow View aus den Private Frameworks von Apple (Keine gute Idee, wenn man die App später auch erfolgreich in den AppStore bringen möchte)</li>
<li> Man benutzt Core Animation und Layers</li>
<li> Man verwendet OpenGL</li>
</ul>
<p>Auf die erste Möglichkeit gehe ich aus verständlichen Gründen nicht weiter ein. Die zweite Variante mit Core Animation kam in einem meiner recht frühen Projekte zum Einsatz (Den Beispielcode erläutere ich nacholgend) und hat sich gut bewährt. Variante 3 setze ich aktuell in den Projekten ein, kann als Library gekauft werden und ist zudem im Video zu sehen.</p>
<p>Da das Core Animation Framework auf dem iPhone nicht ganz so mächtig wie unter MacOSX ist, muss man auf Filter verzichten, trotzdem sind schöne Ergebnisse zu erzielen. Doch nun zum Code.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
<span style="color: #6e371a;">#import </span>
&nbsp;
<span style="color: #a61390;">@protocol</span> RBCoverFlowDelegate
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>numberOfItems;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIImage<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>coverImageForIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>index;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIImage<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>placeholderImage;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>coverHasChangedToIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>index;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>clickOnCoverWithIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>index;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@interface</span> RBCoverFlowView <span style="color: #002200;">:</span> UIView <span style="color: #002200;">&#123;</span>
	CGPoint _startTouchPosition;
	<span style="color: #a61390;">float</span> _centerPosition;
	<span style="color: #a61390;">float</span> _sidePosition;
	CATransform3D _leftTransform;
	CATransform3D _rightTransform;
&nbsp;
	CALayer<span style="color: #002200;">*</span> _contentLayer;
&nbsp;
	<span style="color: #a61390;">id</span> _delegate;
	<span style="color: #a61390;">int</span> _itemCount;
&nbsp;
	CGImageRef _placeholderImageRef;
	UIImage<span style="color: #002200;">*</span> _placeholderImage;
	CGImageRef _maskedPlaceholderImageRef;
&nbsp;
	CGSize _imageSize;
	CGFloat _imageScaleX;
	CGFloat _imageScaleY;
&nbsp;
	<span style="color: #a61390;">float</span> _rowScaleFactor;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Start the cover flow</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>start<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>delegate;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Der Cover Flow besteht zunächst aus einem &#8220;Hauptview&#8221;, der von UIView abgeleitet ist und in dem die Covers dargestellt werden. Dieser ist zudem für das Verarbeiten der Touches und der gesamten Animation zuständig.</p>
<p>Die Covers selber bestehen aus einzelnen Layern, bzw. genau drei Layern pro Cover. Der Layer mit dem Bild selber, ein Layer, der die Spiegelung (Reflection) darstellt und ein Rahmen-Layer, der das ganze Cover umschliesst.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>CALayer <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>addCoverLayer<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>index <span style="color: #002200;">&#123;</span>
	CALayer<span style="color: #002200;">*</span> containerLayer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CALayer layer<span style="color: #002200;">&#93;</span>;
	containerLayer.name <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%d&quot;</span>, index<span style="color: #002200;">&#93;</span>;
	containerLayer.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span>0.0f, 0.0f, <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self maxAvalibleImageWidth<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span>, 1.5f <span style="color: #002200;">*</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self maxAvalibleImageHeight<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	containerLayer.contentsGravity <span style="color: #002200;">=</span> kCAGravityResize;
&nbsp;
	CALayer<span style="color: #002200;">*</span> holderLayer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CALayer layer<span style="color: #002200;">&#93;</span>;
	holderLayer.name <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Holder_%d&quot;</span>, index<span style="color: #002200;">&#93;</span>;
	holderLayer.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span>0.0f, 0.0f, <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self maxAvalibleImageWidth<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">1.5</span> <span style="color: #002200;">*</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self maxAvalibleImageHeight<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	holderLayer.contentsGravity <span style="color: #002200;">=</span> kCAGravityResize;
&nbsp;
	CALayer<span style="color: #002200;">*</span> imageLayer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CALayer layer<span style="color: #002200;">&#93;</span>;
	imageLayer.name <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Image_%d&quot;</span>, index<span style="color: #002200;">&#93;</span>;
	imageLayer.contents <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>_placeholderImageRef;
	imageLayer.frame <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self imageRect<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CGImageRef<span style="color: #002200;">&#41;</span>imageLayer.contents<span style="color: #002200;">&#93;</span>;
	imageLayer.contentsGravity <span style="color: #002200;">=</span> kCAGravityResizeAspectFill;
	imageLayer.masksToBounds <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
&nbsp;
	CALayer<span style="color: #002200;">*</span> reflectionLayer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CALayer layer<span style="color: #002200;">&#93;</span>;
	reflectionLayer.name <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Reflection_%d&quot;</span>, index<span style="color: #002200;">&#93;</span>;
	reflectionLayer.contents <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>_maskedPlaceholderImageRef;
	CGRect frame <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self imageRect<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CGImageRef<span style="color: #002200;">&#41;</span>reflectionLayer.contents<span style="color: #002200;">&#93;</span>;
	frame.origin.y <span style="color: #002200;">=</span> imageLayer.frame.size.height <span style="color: #002200;">+</span> <span style="color: #2400d9;">2</span>;
	reflectionLayer.frame <span style="color: #002200;">=</span> frame;
	reflectionLayer.contentsGravity <span style="color: #002200;">=</span> kCAGravityResize;
	reflectionLayer.masksToBounds <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
	reflectionLayer.transform <span style="color: #002200;">=</span> CATransform3DMakeScale<span style="color: #002200;">&#40;</span>1.0f, <span style="color: #002200;">-</span>1.0f, 1.0f<span style="color: #002200;">&#41;</span>;
	reflectionLayer.opacity <span style="color: #002200;">=</span> <span style="color: #2400d9;">0.6</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>containerLayer setValue<span style="color: #002200;">:</span>imageLayer forKey<span style="color: #002200;">:</span>kImageLayerKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>containerLayer setValue<span style="color: #002200;">:</span>reflectionLayer forKey<span style="color: #002200;">:</span>kImageReflectionKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>containerLayer setValue<span style="color: #002200;">:</span>holderLayer forKey<span style="color: #002200;">:</span>kImageHolderKey<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>holderLayer addSublayer<span style="color: #002200;">:</span>imageLayer<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>holderLayer addSublayer<span style="color: #002200;">:</span>reflectionLayer<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>containerLayer addSublayer<span style="color: #002200;">:</span>holderLayer<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> containerLayer;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Sind die Layer erstellt worden, müssen die einzelnen Cover nun entsprechend positioniert werden, damit das Aussehen dem Cover Flow der iPod App entspricht. Dies erreicht man, in dem man jeden einzelnen Layer im Raum positioniert, skaliert und leicht dreht.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>layoutSublayer<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CALayer<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>rootLayer number<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>number <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">int</span> selectedIndex <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>_contentLayer valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;selectedIndex&quot;</span><span style="color: #002200;">&#93;</span> integerValue<span style="color: #002200;">&#93;</span>;
&nbsp;
	rootLayer.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span>0.0f, 0.0f, <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self maxAvalibleImageWidth<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span>, 1.5f <span style="color: #002200;">*</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self maxAvalibleImageHeight<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	CATransform3D layerTransform <span style="color: #002200;">=</span> CATransform3DIdentity;
	layerTransform.m34 <span style="color: #002200;">=</span> 1.0f <span style="color: #002200;">/</span> _sidePosition;
&nbsp;
	CALayer<span style="color: #002200;">*</span> holder <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>rootLayer valueForKey<span style="color: #002200;">:</span>kImageHolderKey<span style="color: #002200;">&#93;</span>;
&nbsp;
	CGPoint pos <span style="color: #002200;">=</span> CGPointMake<span style="color: #002200;">&#40;</span>CGRectGetMidX<span style="color: #002200;">&#40;</span>_contentLayer.bounds<span style="color: #002200;">&#41;</span>, CGRectGetMidY<span style="color: #002200;">&#40;</span>_contentLayer.bounds<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>number <span style="color: #002200;">&amp;</span>lt; selectedIndex<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		pos.x <span style="color: #002200;">-=</span> <span style="color: #002200;">&#40;</span>selectedIndex <span style="color: #002200;">-</span> number<span style="color: #002200;">&#41;</span> <span style="color: #002200;">*</span> _imageSize.width <span style="color: #002200;">*</span> _rowScaleFactor;
		holder.transform <span style="color: #002200;">=</span> _leftTransform;
		holder.zPosition <span style="color: #002200;">=</span> _sidePosition;
		rootLayer.zPosition <span style="color: #002200;">=</span> _sidePosition <span style="color: #002200;">-</span> 0.1f <span style="color: #002200;">*</span> <span style="color: #002200;">&#40;</span>selectedIndex <span style="color: #002200;">-</span> number<span style="color: #002200;">&#41;</span>;
		rootLayer.sublayerTransform <span style="color: #002200;">=</span> layerTransform;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>number <span style="color: #002200;">&amp;</span>gt; selectedIndex<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		pos.x <span style="color: #002200;">+=</span> <span style="color: #002200;">&#40;</span>number <span style="color: #002200;">-</span> selectedIndex<span style="color: #002200;">&#41;</span> <span style="color: #002200;">*</span> _imageSize.width <span style="color: #002200;">*</span> _rowScaleFactor;
		holder.transform <span style="color: #002200;">=</span> _rightTransform;
		holder.zPosition <span style="color: #002200;">=</span> _sidePosition;
		rootLayer.zPosition <span style="color: #002200;">=</span> _sidePosition <span style="color: #002200;">-</span> 0.1f <span style="color: #002200;">*</span> <span style="color: #002200;">&#40;</span>number <span style="color: #002200;">-</span> selectedIndex<span style="color: #002200;">&#41;</span>;
		rootLayer.sublayerTransform <span style="color: #002200;">=</span> layerTransform;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		pos.x <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>self.bounds.size.width <span style="color: #002200;">-</span> _imageSize.width<span style="color: #002200;">&#41;</span> <span style="color: #002200;">/</span> <span style="color: #2400d9;">2</span>;
		holder.transform <span style="color: #002200;">=</span> CATransform3DIdentity;
		holder.zPosition <span style="color: #002200;">=</span> _centerPosition;
		holder.filters <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
		rootLayer.zPosition <span style="color: #002200;">=</span> _centerPosition;
		rootLayer.sublayerTransform <span style="color: #002200;">=</span> CATransform3DIdentity;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	rootLayer.position <span style="color: #002200;">=</span> pos;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Die Animation ist in dem Code (Hier sind die kompletten <a href="http://www.rogerboesch.com/tutorials/CoverFlowSource.zip">Source Files</a>) bewusst recht einfach gehalten und unterstützt keine sogenannten Heartbeat Animationen, d.h. Animationen die sogleich beginnen, wenn der Finger aufgesetzt wird. Im käuflichen und auf OpenGL basierten Code ist dies selbstverständlich vorhanden und insbesondere das Laden und Aufbauen der Bilder noch stark optimiert. Aber als Einstieg und fürs bessere Verständnis hoffe ich, dass der Beispielcode hier erstmal weiterhilft. Wer mehr darüber erfahren möchte, dem möchte ich nochmals unsere <a href="http://www.rogerboesch.com/workshops/">Workshops</a> ans Herz legen, in denen wir wesentlich tiefer in die Materie einsteigen können. Also, viel Spass beim Cover Flow programmieren und nicht vergessen, auf mein Blog zu verlinken wenn Ihr die erste iApp mit Cover Flow in den Appstore bringt <img src='http://www.rogerboesch.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Anfangs basierte dieser Code übrigens auf einem Beispiel Code von <a title='Original Link: http://bill.dudney.net/roller/objc/'  href="http://www.rogerboesch.com/?1haoVHxh">Bill Dudney</a>, der damals einen Artikel über die Programmierung eines Cover Flow unter MacOSX veröffenlichte und auch ein sehr gut geschriebenes Buch zum Thema Core Animation geschrieben hat.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/08/16/coverflow-programmieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-C</title>
		<link>http://www.rogerboesch.com/2009/08/01/objective-c/</link>
		<comments>http://www.rogerboesch.com/2009/08/01/objective-c/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 06:45:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[Code snippet]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=538</guid>
		<description><![CDATA[Aufbauend auf den beiden ersten, ganz einfachen &#8220;Hello World&#8217;s&#8221; möchte ich nun ein wenig näher auf die Programmiersprache Objective-C eingehen. Das Schwergewicht werde ich dabei auf die Punkte legen, die für den Einstieg und das bessere Verständnis unbedingt notwendig sind. Die Notation verwirrt anfangs zwar ein wenig, wer sich jedoch damit beschäftigt und auf die [...]]]></description>
			<content:encoded><![CDATA[<p>Aufbauend auf den beiden ersten, ganz einfachen &#8220;Hello World&#8217;s&#8221; möchte ich nun ein wenig näher auf die Programmiersprache Objective-C eingehen. Das Schwergewicht werde ich dabei auf die Punkte legen, die für den Einstieg und das bessere Verständnis unbedingt notwendig sind. Die Notation verwirrt anfangs zwar ein wenig, wer sich jedoch damit beschäftigt und auf die Sprache einlässt, wird schnell merken wie leistungsfähig das Ganze ist. Insbesondere im Zusammenspiel mit dem dahinterstehenden Framework des iPhones: Cocoa Touch.</p>
<p>Wichtigstes Element: Die <strong>Klasse</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Person <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
     <span style="color: #11740a; font-style: italic;">// Das sind Instanz Variablen</span>
     <span style="color: #a61390;">int</span> alter;  <span style="color: #11740a; font-style: italic;">// ... vom Typ int</span>
     <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name;  <span style="color: #11740a; font-style: italic;">// ...vom Typ NSString (Klasse)</span>
     <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> vorname;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Das sind Messages:</span>
<span style="color: #11740a; font-style: italic;">// In Objective-C heissen Methoden Messages</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>initialisieren;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setAlter<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>alter;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setPerson<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>name vorname<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>vorname;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>getJahrgang;
&nbsp;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Person
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setAlter<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>alter <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// Mach irgendetwas ...</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
...
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Darin unterscheidet sich die Sprache noch nicht wesentlich von vielen Anderen, wie z.B. Java oder C#. Wie in C++ trennt man allerdings Klassen in deren Beschreibung (<em>@interface</em>) und deren Implementierung (<em>@implementation</em>).</p>
<p>Universeller Zugriff auf Klassen: <strong>id</strong><br />
Der Datentyp <em>id</em> ist eine einfache, aber wichtige Erweiterung in Objective-C. Um Klassen unabhägig vom Typ (Bsp. Person) ansprechen zu können, genügt es diese mit id zu deklarieren. Dies wird insbesondere bei der Kommunikation zwischen Interface Builder und Code (Messaging) intensiv genutzt.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">id</span> person <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>Person new<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Der Aufruf von Klassen: <strong>Messages</strong><br />
Ein wenig ungewohnt sieht das Ganze aus, wenn man eine Nachricht (Message) einer Klasse aufrufen möchte. Obige Klasse wird beispielsweise wie folgt angesprochen:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">Person<span style="color: #002200;">*</span> person <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>Person new<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>person initialisieren<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>und mit Parametern:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">Person<span style="color: #002200;">*</span> person <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>Person new<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>person setAlter<span style="color: #002200;">:</span><span style="color: #2400d9;">35</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>person setPerson<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Muster&quot;</span> vorname<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Peter&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Vereinfachung durch <strong>Properties</strong> (@property)<br />
Properties gibt es seit Version 2.0 von Objective-C und erweitern Klassen um die Möglichkeit, einfacher auf Instanz Variablen zuzugreifen. Eine Fähigkeit, die es eigentlich in allen modernen objektorientieren Sprachen gibt. Damit kann der Codeumfang stark reduziert werden, da der Compiler selber das mühsame Schreiben der Getter und Setter Methoden übernimmt:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Person <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
     <span style="color: #a61390;">int</span> alter;
     <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name;
     <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> vorname;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #a61390;">int</span> alter;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> vorname;
&nbsp;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Person
&nbsp;
<span style="color: #a61390;">@synthesize</span> alter;
<span style="color: #a61390;">@synthesize</span> name;
<span style="color: #a61390;">@synthesize</span> vorname;</pre></div></div>

<p>Wobei die Vereinfachung genaugenommen erst beim Aufruf zum Tragen kommt, da nun folgendermassen auf die Instanz Variablen des Objekts zugegriffen werden kann:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">Person<span style="color: #002200;">*</span> person <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>Person new<span style="color: #002200;">&#93;</span>;
person.alter <span style="color: #002200;">=</span> <span style="color: #2400d9;">35</span>;
person.name <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Muster&quot;</span>;
person.vorname <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Peter&quot;</span>;
<span style="color: #a61390;">int</span> jahrgang <span style="color: #002200;">=</span> <span style="color: #2400d9;">2009</span><span style="color: #002200;">-</span>person.alter;</pre></div></div>

<p>Die sieht natürlich vorallem für Entwickler, die von Java oder C# her kommen, sehr viel gewohnter aus und bietet zudem einige Vorteile bei der Speicherverwaltung. Wer sich noch näher mit Properties beschäftigen möchte, der findet auf den Apple Seiten alles Wichtige dazu, auch was es mit dem Keyword <em>@synthesize</em> und den Attributen <em>nonatomic</em> und <em>retain</em> auf sich hat.</p>
<p>There&#8217;s one more thing: <strong>IBOutlet</strong> und <strong>IBAction</strong><br />
Die beiden Keywords IBOutlet und IBAction gehören genaugenommen nicht zu Objective-C und dienen dazu, den Code für den Interface Builder zu markieren. So kann dieser erkennen, welche Message durch welches UI Element (Bsp. Button) aufgerufen werden soll (Action Target Prinzip) und welche Instanz Variable mit welchem UI Element (Bsp. Label) verknüpft wird. Die Anwendung ist dabei ganz einfach:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Person <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
     UILabel<span style="color: #002200;">*</span> text;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Dieses Textfeld kann in Interface Builder verknüpft werden</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UILabel<span style="color: #002200;">*</span> text;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Diese Message kann von Interface Builder aufgerufen werden</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>aendereText<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>So, das soll es nun aber für den Moment auch schon sein, obwohl die Sprache natürlich noch viel mehr zu bieten hat. Für den Einstieg und erste einfache Programme genügt dies aber bereits udn wir werden dies in den kommenden Screencasts auch intensiv nutzen.<br />
Also, nur Mut! Der Einstieg ist ein wenig ungewohnt, aber man findet sich schnell zurecht und Spass macht es sowieso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/08/01/objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues (Screencast) Hello World</title>
		<link>http://www.rogerboesch.com/2009/07/30/neues-video-hello-world/</link>
		<comments>http://www.rogerboesch.com/2009/07/30/neues-video-hello-world/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 07:49:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=533</guid>
		<description><![CDATA[Nach gut einem Jahr seit Erscheinen des ersten &#8220;Hello Worlds&#8221; auf diesem Blog ist es nun an der Zeit, den Artikel auzupeppen und vorallem mit Screenflow aufzuzeichnen. Den Anfang machen nun Teil I und II, die sich mit dem Einstieg in die iPhone Entwicklung und dem Verknüpfen von Code und Benutzeroberfläche befassen. Sicher eine der [...]]]></description>
			<content:encoded><![CDATA[<p>Nach gut einem Jahr seit Erscheinen des ersten &#8220;Hello Worlds&#8221; auf diesem Blog ist es nun an der Zeit, den Artikel auzupeppen und vorallem mit Screenflow aufzuzeichnen. Den Anfang machen nun Teil I und II, die sich mit dem Einstieg in die iPhone Entwicklung und dem Verknüpfen von Code und Benutzeroberfläche befassen. Sicher eine der Eigenheiten, in denen sich die iPhone Programmierung am Meisten von der auf anderen Plattformen unterscheidet.<br />
In den weiteren Folgen befasse ich mich dann detaillierter mit Objective-C und weiteren Teilen von CocoaTouch, dem Framework, auf dem alle iApps aufbauen.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/p/D0D2C199D9D7BB5D&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/p/D0D2C199D9D7BB5D&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Und hier wie gewohnt, der <a href="http://www.rogerboesch.com/tutorials/HelloWorld.zip">Source Code</a> dazu. Viel Spass beim Auspropieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/30/neues-video-hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Screenshot programmieren</title>
		<link>http://www.rogerboesch.com/2009/07/28/screenshot-programmieren/</link>
		<comments>http://www.rogerboesch.com/2009/07/28/screenshot-programmieren/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 10:28:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[Code snippet]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=527</guid>
		<description><![CDATA[Manchmal ist es nützlich, Screenshots zu machen. Jeder iPhone User kennt diese nützliche Tasten Kombination.
Mit den folgenden Programzeilen, ist dies auch sehr einfach in eigenen Programmen integrierbar.
Diese Zeilen einfach in einen View Controller einbauen und fertig:

1
2
3
4
5
6
7
-&#40;IBAction&#41;captureScreen:&#40;id&#41;sender &#123;
	UIGraphicsBeginImageContext&#40;self.view.frame.size&#41;;
	&#91;self.view.layer renderInContext:UIGraphicsGetCurrentContext&#40;&#41;&#93;;
	UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext&#40;&#41;;
	UIGraphicsEndImageContext&#40;&#41;;
	UIImageWriteToSavedPhotosAlbum&#40;viewImage, nil, nil, nil&#41;;
&#125;

]]></description>
			<content:encoded><![CDATA[<p>Manchmal ist es nützlich, Screenshots zu machen. Jeder iPhone User kennt diese nützliche Tasten Kombination.<br />
Mit den folgenden Programzeilen, ist dies auch sehr einfach in eigenen Programmen integrierbar.<br />
Diese Zeilen einfach in einen View Controller einbauen und fertig:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>captureScreen<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender <span style="color: #002200;">&#123;</span>
	UIGraphicsBeginImageContext<span style="color: #002200;">&#40;</span>self.view.frame.size<span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#91;</span>self.view.layer renderInContext<span style="color: #002200;">:</span>UIGraphicsGetCurrentContext<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	UIImage<span style="color: #002200;">*</span> viewImage <span style="color: #002200;">=</span> UIGraphicsGetImageFromCurrentImageContext<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
	UIGraphicsEndImageContext<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
	UIImageWriteToSavedPhotosAlbum<span style="color: #002200;">&#40;</span>viewImage, <span style="color: #a61390;">nil</span>, <span style="color: #a61390;">nil</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/28/screenshot-programmieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SDK 3.0 &#8211; MapKit</title>
		<link>http://www.rogerboesch.com/2009/07/24/sdk-3-0-mapkit/</link>
		<comments>http://www.rogerboesch.com/2009/07/24/sdk-3-0-mapkit/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 10:43:11 +0000</pubDate>
		<dc:creator>roger</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[3.0]]></category>
		<category><![CDATA[MapKit]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=427</guid>
		<description><![CDATA[Im iPhone SDK 3.0 gibt es viele Bereiche, die für sich alleine schon ein ganzes Blog füllen würden. Ich picke deshalb der Reihe nach ein paar der neuen Frameworks und Klassen heraus und ergänze sie jeweils mit konkreten Code Beispielen zum selber ausprobieren. Dazu gibts Videos, die den Ablauf detailliert erklären. Beginnen werde ich an [...]]]></description>
			<content:encoded><![CDATA[<p>Im iPhone SDK 3.0 gibt es viele Bereiche, die für sich alleine schon ein ganzes Blog füllen würden. Ich picke deshalb der Reihe nach ein paar der neuen Frameworks und Klassen heraus und ergänze sie jeweils mit konkreten Code Beispielen zum selber ausprobieren. Dazu gibts Videos, die den Ablauf detailliert erklären. Beginnen werde ich an der Stelle mit MapKit. MapKit ist in einfachen Worten, die Möglichkeit Google Maps in eigene Apps einzubauen, <strong>ohne</strong> das über eine normale Browseranbindung wie bisher machen zu müssen. Der Vorteil liegt auf der Hand: Alles läuft viel schneller und fast noch wichtiger, iPhone like mit schönen Animationen und Unterstützung der ganzen Gestures. Der Einstieg in MapKit ist dabei sehr einfach und geschieht durch Einbindung der von UIView abgeleiteten Klasse MkMapView. Diese stellt schon mal alles zur Verfügung, um eine Karte anzuschauen, in dieser zu scrollen und zu zoomen. Als nächstes bauen wir die Anzeige unseres aktuellen Standorts ein (die blaue, von Google Maps her bekannte Stecknadel) und ergänzen unsere kleine Map Anwendung um die Möglichkeit, einen beliebigen anderen Standort anzuzeigen. Hier kommt die MkAnnotationView Klasse zum Einsatz, die zusammen mit MKMapView die wichtigsten Konzepte einer Map Integration abdeckt. Viel Spass beim selber Ausprobieren!</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/p/45578B6F6FB337DF&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/p/45578B6F6FB337DF&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Soweit unser Einstig in MapKit. Im nächsten Beitrag bauen wir das Programm aus und ergänzen es um eine einfache Suche nach Orten, die wir anschliessend in der Karte anzeigen.<br />
<a href="http://www.rogerboesch.com/tutorials/MapKit-Part1.zip">Source zum Artikel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/24/sdk-3-0-mapkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
