<?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; iPhone/iPad Programming</title>
	<atom:link href="http://www.rogerboesch.com/category/dev/iphonedev/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>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>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>
		<item>
		<title>UDID anzeigen</title>
		<link>http://www.rogerboesch.com/2009/07/14/udid-anzeigen/</link>
		<comments>http://www.rogerboesch.com/2009/07/14/udid-anzeigen/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 09:38:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[Tip of the week]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=298</guid>
		<description><![CDATA[Klickt man in der Hauptansicht in iTunes auf die gelistete Seriennummer des angeschlossenen iPhones, taucht die ‘UDID’ auf. Möchte man Jemandem eine Preview-Version seiner Software per Adhoc-Netzwerk vorab zur Verfügung stellen, muss ein entsprechendes Zertifikat auf die entsprechende UDID-Adresse ausgestellt werden. Diese 16-stellige Nummer erhält man, indem man auf die Seriennummer clickt (Roter Kreis). Diese [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rogerboesch.com/wp-content/uploads/2009/07/udid.jpg" rel="lightbox[298]"><img class="size-thumbnail wp-image-300 alignleft" style="border: 5px; margin: 5px;" title="udid" src="http://www.rogerboesch.com/wp-content/uploads/2009/07/udid-150x150.jpg" alt="udid" width="150" height="150" /></a>Klickt man in der Hauptansicht in iTunes auf die gelistete Seriennummer des angeschlossenen iPhones, taucht die ‘UDID’ auf. Möchte man Jemandem eine Preview-Version seiner Software per Adhoc-Netzwerk vorab zur Verfügung stellen, muss ein entsprechendes Zertifikat auf die entsprechende UDID-Adresse ausgestellt werden. Diese 16-stellige Nummer erhält man, indem man auf die Seriennummer clickt (Roter Kreis). Diese Nummer kann nun mit Copy &amp; Paste bequem per E-Mail zugesandt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/14/udid-anzeigen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Langsamer iPhone Simulator</title>
		<link>http://www.rogerboesch.com/2009/07/10/simulieren-der-netzwerkgeschwindigkeit-im-simulator/</link>
		<comments>http://www.rogerboesch.com/2009/07/10/simulieren-der-netzwerkgeschwindigkeit-im-simulator/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 20:25:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[Tip of the week]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=293</guid>
		<description><![CDATA[Leider gibt es im iPhone Simulator einige Dinge, die recht unterschiedlich sind gegenüber dem Verhalten auf dem iPhone. Eines davon ist die Geschwindigkeit beim Downloaden von Daten. Unter Edge oder auch 3G dauert das schon mal seine Zeit und auch das Verhalten der eigenen Software kann unter anderen Rahmenbedingungen durchaus anders sein. Beispielsweise Timeouts oder [...]]]></description>
			<content:encoded><![CDATA[<p>Leider gibt es im iPhone Simulator einige Dinge, die recht unterschiedlich sind gegenüber dem Verhalten auf dem iPhone. Eines davon ist die Geschwindigkeit beim Downloaden von Daten. Unter Edge oder auch 3G dauert das schon mal seine Zeit und auch das Verhalten der eigenen Software kann unter anderen Rahmenbedingungen durchaus anders sein. Beispielsweise Timeouts oder Ähnliches.<br />
Mit den nachfolgenden Befehlen lässt sich dieses Verhalten jedoch auch im Simulator testen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">sudo ipfw pipe <span style="color: #cc66cc;">1</span> config bw 120Kbit
sudo ipfw add <span style="color: #cc66cc;">10</span> pipe <span style="color: #cc66cc;">1</span> tcp from any to me</pre></td></tr></table></div>

<p>Damit wird eine Pipe mit begrenzter Geschwindigkeit aufgesetzt, so dass die Daten im Simulator langsamer ankommen. Um das Ganze nachher wieder aufzuheben genügt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">sudo ipfw delete <span style="color: #cc66cc;">10</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/10/simulieren-der-netzwerkgeschwindigkeit-im-simulator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SDK 3.1 verfügbar</title>
		<link>http://www.rogerboesch.com/2009/07/01/sdk-3-1-verfugbar/</link>
		<comments>http://www.rogerboesch.com/2009/07/01/sdk-3-1-verfugbar/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 06:24:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[3.0]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=279</guid>
		<description><![CDATA[Nur zwei Wochen, nachdem die Firmware 3.0 offiziell verfügbar wurde, stellt Apple den iPhone-Entwickler bereits eine neue Beta-Version zur Verfügung. Interessanterweise kommen ein paar durchaus spannende Features hinzu, die es wahrscheinlich nicht mehr rechtzeitig in den 3.0 Release geschafft hatten:

Filmschnipsel können jetzt auch als Kopie abgespeichert werden
Sprachsteuerung über Bluetooth-Headsets wir möglich
Haptisches Feedback durch Vibration, wenn [...]]]></description>
			<content:encoded><![CDATA[<p>Nur zwei Wochen, nachdem die Firmware 3.0 offiziell verfügbar wurde, stellt Apple den iPhone-Entwickler bereits eine neue Beta-Version zur Verfügung. Interessanterweise kommen ein paar durchaus spannende Features hinzu, die es wahrscheinlich nicht mehr rechtzeitig in den 3.0 Release geschafft hatten:</p>
<ul>
<li>Filmschnipsel können jetzt auch als Kopie abgespeichert werden</li>
<li>Sprachsteuerung über Bluetooth-Headsets wir möglich</li>
<li>Haptisches Feedback durch Vibration, wenn man die Anordnung der Home Apps verschiebt</li>
<li>Optimierung von OpenGL</li>
<li>API-Schnittstelle erlaubt Drittanbietern den Zugriff auf die 3GS-Videos</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/07/01/sdk-3-1-verfugbar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Push Notifications</title>
		<link>http://www.rogerboesch.com/2009/06/28/push-notifications/</link>
		<comments>http://www.rogerboesch.com/2009/06/28/push-notifications/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 14:57:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone/iPad Programming]]></category>
		<category><![CDATA[3.0]]></category>
		<category><![CDATA[Push Notification]]></category>

		<guid isPermaLink="false">http://www.rogerboesch.com/?p=173</guid>
		<description><![CDATA[Push Notifications sind sicherlich eines der Highlights im SDK 3.0. Obwohl relativ leicht zu implementieren, gibt es doch einige Fallstricke und Fragen, die auftauchen, wenn man sich mit dem Thema befasst. In diesem Artikel geht es dabei im Wesentlichen um die Einbindung auf dem iPhone. Fast die meiste Arbeit gilt es jedoch auf einem Push [...]]]></description>
			<content:encoded><![CDATA[<p>Push Notifications sind sicherlich eines der Highlights im SDK 3.0. Obwohl relativ leicht zu implementieren, gibt es doch einige Fallstricke und Fragen, die auftauchen, wenn man sich mit dem Thema befasst. In diesem Artikel geht es dabei im Wesentlichen um die Einbindung auf dem iPhone. Fast die meiste Arbeit gilt es jedoch auf einem Push Provider (Server) zu implementieren, doch dazu mehr in einem der nächsten Post&#8217;s.</p>
<p>Im SDK stehen neue Methoden zur Verfügung, um Push Notifications einzubinden. Diese werden im Application Delegate untergebracht und werden vom iPhone entsprechend den eingehene Notifications aufgerufen. Dabei sind die Schritte immer dieselben:</p>
<ol>
<li>Registrieren beim Apple Notification Server (APNS). Dies ist bei jedem Start erforderlich und geschieht mittels: <em>registerForRemoteNotificationTypes</em></li>
<li>Danach ruft das iPhone OS eine der beiden Methoden auf. Im Falle einer erfolgreichen Registrierung:<em><br />
didReceiveRemoteNotification</em>, falls nicht <em>didFailToRegisterForRemoteNotificationsWithError</em>.</li>
</ol>
<p>Das war&#8217;s dann leider auch schon fast, was das SDK zu bieten hat. Leider wird beispielweise <em>didRecieveNotification</em> nur aufgerufen, wenn die Applikation gerade geöffnet ist. Erscheint jedoch die bekannte Alert Box, die einem auf eine Push Notification hinweist, wird die eigene iApp zwar gestartet, allerdings ist das Vorgehen dann anders, um darauf zu reagieren. Hier wurde eine weitere Methode eingefüht, die es  erlaubt, sogenante Launch Options beim Aufstarten abzufragen, ähnlich von Command Line Parametern auf Desktop Rechner. Auf dem iPhone heisst die entsprechende Methode <em>didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;</em> die es zu implementieren gilt. Dabei ist der wichtige Parameter <em>launchOptions</em>, in dem mittels des Keys <em>UIApplicationLaunchOptionsRemoteNotificationKey</em> die notwendigen Push Infos abgefragt werden können, was dann ungefähr so aussieht:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span> userInfo <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>launchOptions valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;UIApplicationLaunchOptionsRemoteNotificationKey&quot;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>So haben wir nun iPhone seitig alles zusammen, um Push Notifications einzubinden. Alles Andere erfolgt ausschliesslich auf dem APNS und dem eigenen Server. Eine Herausforderung bleibt dabei das Testing und wie das am Besten zu bewerkstelligen ist, beschreibe ich im nächsten Topic of the Week.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogerboesch.com/2009/06/28/push-notifications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
