<?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>Inside RogueSheep &#187; Word Spin</title>
	<atom:link href="http://blog.roguesheep.com/category/word-spin/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.roguesheep.com</link>
	<description>Behind the scenes with the sheep</description>
	<lastBuildDate>Sun, 15 Jan 2012 20:35:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Postage and WORD SPIN &#8211; 2009 Best App Ever</title>
		<link>http://blog.roguesheep.com/2010/01/07/postage-and-word-spin-2009-best-app-ever/</link>
		<comments>http://blog.roguesheep.com/2010/01/07/postage-and-word-spin-2009-best-app-ever/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 19:52:05 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Postage]]></category>
		<category><![CDATA[RogueSheep]]></category>
		<category><![CDATA[Word Spin]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.roguesheep.com/?p=221</guid>
		<description><![CDATA[We are honored that both Postage and WORD SPIN have been nominated in the 2009 Best App Ever awards. If you enjoy our apps, please consider heading over to the Best App Ever web site and voting! Vote for Postage ~ Postcards in Best Visual Design Vote for WORD SPIN® in Best Word Game]]></description>
			<content:encoded><![CDATA[<p>We are honored that both Postage and WORD SPIN have been nominated in the 2009 Best App Ever awards. If you enjoy our apps, please consider heading over to the Best App Ever web site and voting!</p>

<div style="margin-top: 23px; margin-right: auto; margin-left: auto; width: 165px; background-color: #242426; padding: 5px; border: 3px solid #777777;"><a href="http://bestappever.com/v/vdap/312231322" target="_blank"><img src="http://bestappever.com/images/bae-small_2009.png" border="0" alt="" /></a>
<span style="font-family: Arial,Helvetica,sans-serif;font-size: 10pt;line-height: 12pt;text-align:center;color: #d9d9d9;">Vote for
<strong>Postage ~ Postcards</strong>
in
<strong>Best Visual Design</strong>
<a href="http://bestappever.com/v/vdap/312231322" target="_blank"><img src="http://bestappever.com/images/button_vote.png" border="0" alt="" /></a>
</span></div>

<div style="margin-top: 23px; margin-right: auto; margin-left: auto; width: 165px; background-color: #242426; padding: 5px; border: 3px solid #777777;"><a href="http://bestappever.com/v/wogm/335201876" target="_blank"><img src="http://bestappever.com/images/bae-small_2009.png" border="0" alt="" /></a><span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt; &lt;br /&gt; line-height: 12pt; &lt;br /&gt; text-align: center; color: #d9d9d9;">Vote for
<strong>WORD SPIN®</strong>
in
<strong>Best Word Game</strong>
<a href="http://bestappever.com/v/wogm/335201876" target="_blank"><img src="http://bestappever.com/images/button_vote.png" border="0" alt="" /></a></span></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.roguesheep.com/2010/01/07/postage-and-word-spin-2009-best-app-ever/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Animation Sequence</title>
		<link>http://blog.roguesheep.com/2009/12/11/iphone-animation-sequence/</link>
		<comments>http://blog.roguesheep.com/2009/12/11/iphone-animation-sequence/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 16:04:46 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Postage]]></category>
		<category><![CDATA[RogueSheep]]></category>
		<category><![CDATA[Word Spin]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.roguesheep.com/?p=155</guid>
		<description><![CDATA[When writing Postage and WORD SPIN we encountered the same problem again and again: the need to chain a sequence of animations together. For example, when the user navigates to the next page we first animate away the controls for the current view, switch views, then animate the controls in for the new view. Initially, [...]]]></description>
			<content:encoded><![CDATA[<p>When writing <a href="http://postage.roguesheep.com/">Postage</a> and <a href="http://wordspin.roguesheep.com/">WORD SPIN</a> we encountered the same problem again and again: the need to chain a sequence of animations together. For example, when the user navigates to the next page we first animate away the controls for the current view, switch views, then animate the controls in for the new view. Initially, we set the UIView delegate and then in our specified selector implementation kicked off the next animation which itself would eventually call back into a completion selector, and so on. But it&#8217;s largely the same code over and over, and you either need a bunch of similar looking animationDidStop implementations, or a single implementation that branches based on the animation identifier. For example:</p>

<h3>Old Way</h3>

<pre>

<div class="codecolorer-container objc blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> doMoveFromView1ToView2Animation<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>app beginIgnoringInteractionEvents<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView beginAnimations<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;HideView1Animation&quot;</span> context<span style="color: #002200;">:</span> foo<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDuration<span style="color: #002200;">:</span> kDuration<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDelegate<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDidStopSelector<span style="color: #002200;">:</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>hideView1AnimationDidStop<span style="color: #002200;">:</span>finished<span style="color: #002200;">:</span>context<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self hideView1Code<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView commitAnimations<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>hideView1AnimationDidStop<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>animationID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finished<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>finished <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView beginAnimations<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;SwapView1AndView2Animation&quot;</span> context<span style="color: #002200;">:</span> foo<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDuration<span style="color: #002200;">:</span> kDuration<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDelegate<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDidStopSelector<span style="color: #002200;">:</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>swapView1AndView2AnimationDidStop<span style="color: #002200;">:</span>finished<span style="color: #002200;">:</span>context<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self swapView1AndView2Code<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView commitAnimations<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>swapView1AndView2AnimationDidStop<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>animationID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finished<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>finished <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView beginAnimations<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ShowView2Animation&quot;</span> context<span style="color: #002200;">:</span> foo<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDuration<span style="color: #002200;">:</span> kDuration<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDelegate<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDidStopSelector<span style="color: #002200;">:</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>showView2AnimationDidStop<span style="color: #002200;">:</span>finished<span style="color: #002200;">:</span>context<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self showView2Code<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView commitAnimations<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>showView2AnimationDidStop<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>animationID<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finished<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>finished <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>app endIgnoringInteractionEvents<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self doStuff<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></div>

</pre>

<p>When we embarked on <a href="http://wordspin.roguesheep.com/">WORD SPIN</a> it was time to build something to help tackle this problem. I settled on the concept of sequences, where each individual animation is a step in the overall animation sequence. For the user example of moving from one page to the next in Postage, the new code looks like this:</p>

<h3>New Way</h3>

<pre>

<div class="codecolorer-container objc blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> doMoveFromView1ToView2Animation<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/"><span style="color: #400080;">NSMutableArray</span></a><span style="color: #002200;">*</span> steps <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/"><span style="color: #400080;">NSMutableArray</span></a> array<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>steps addObject<span style="color: #002200;">:</span> <span style="color: #002200;">&#91;</span>RSViewAnimationSequenceStep stepWithTarget<span style="color: #002200;">:</span> self <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selector<span style="color: #002200;">:</span> <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>hideView1Code<span style="color: #002200;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duration<span style="color: #002200;">:</span> kDuration<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>steps addObject<span style="color: #002200;">:</span> <span style="color: #002200;">&#91;</span>RSViewAnimationSequenceStep stepWithTarget<span style="color: #002200;">:</span> self <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selector<span style="color: #002200;">:</span> <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>swapView1AndView2Code<span style="color: #002200;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duration<span style="color: #002200;">:</span> kDuration<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>steps addObject<span style="color: #002200;">:</span> <span style="color: #002200;">&#91;</span>RSViewAnimationSequenceStep stepWithTarget<span style="color: #002200;">:</span> self <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selector<span style="color: #002200;">:</span> <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>showView2Code<span style="color: #002200;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duration<span style="color: #002200;">:</span> kDuration<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>RSSequenceManager sharedManager<span style="color: #002200;">&#93;</span> invokeSequence<span style="color: #002200;">:</span> steps<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></div>

</pre>

<p>What I really like about this approach is that the entire animation sequence is specified in the same location and it&#8217;s clear how many independent steps there are up front, rather than jumping from one place in the code to the next to see what the whole animation will do. Granted, you could almost achieve the same visual effect by refactoring all the &#8220;beginAnimation&#8221; code into a reusable piece. In fact, that&#8217;s how I started. </p>

<p>The fundamental piece of this paradigm is the sequence step. RSViewAnimationSequenceStep inherits from RSSequenceStep, a base class to define the invocation and delegation of the step. RSViewAnimationSequenceStep is primarily a refactoring of the beginAnimation and commitAnimation boiler plate (I&#8217;ve removed the definition of the helper, init, and dealloc selectors for brevity):</p>

<h3>RSViewAnimationSequenceStep</h3>

<pre>

<div class="codecolorer-container objc blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@interface</span> RSViewAnimationSequenceStep <span style="color: #002200;">:</span> RSSequenceStep <br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">id</span>&nbsp; &nbsp; &nbsp; target_;<br />
&nbsp; &nbsp; <span style="color: #a61390;">SEL</span> &nbsp; &nbsp; selector_;<br />
&nbsp; &nbsp; <span style="color: #a61390;">float</span> &nbsp; duration_;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> stepWithTarget<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> target selector<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">SEL</span><span style="color: #002200;">&#41;</span> selector duration<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span> duration;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invoke;<br />
<br />
<span style="color: #a61390;">@end</span><br />
<br />
<span style="color: #a61390;">@implementation</span> RSViewAnimationSequenceStep<br />
<br />
<span style="color: #11740a; font-style: italic;">// helper, init, and dealloc removed for brevity</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invoke<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView beginAnimations<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;RSViewAnimationSequenceStep&quot;</span> context<span style="color: #002200;">:</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDuration<span style="color: #002200;">:</span> duration_<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDelegate<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView setAnimationDidStopSelector<span style="color: #002200;">:</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>animationDidStop<span style="color: #002200;">:</span>finished<span style="color: #002200;">:</span>context<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>target_ performSelector<span style="color: #002200;">:</span> selector_<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>UIView commitAnimations<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> animationDidStop<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>animationID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finished<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>finished <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context <br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// delegate is defined in the base class RSSequenceStep (see below)</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>delegate_ stepCompleted<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@end</span></div></div>

</pre>

<p>The RSSequenceStep is a simple base class to define the general interface:</p>

<h3>RSSequenceStep</h3>

<pre>

<div class="codecolorer-container objc blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@interface</span> RSSequenceStep <span style="color: #002200;">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">id</span>&nbsp; delegate_;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, assign<span style="color: #002200;">&#41;</span> &nbsp; <span style="color: #a61390;">id</span>&nbsp; delegate; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// The object that implements stepCompleted.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invoke;<br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Called to invoke the code necessary for the step. </span><br />
&nbsp; &nbsp; <br />
<span style="color: #a61390;">@end</span><br />
<br />
<span style="color: #a61390;">@interface</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <span style="color: #002200;">&#40;</span>RSSequenceStepDelegate<span style="color: #002200;">&#41;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stepCompleted<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>RSSequenceStep<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> step;<br />
<br />
<span style="color: #a61390;">@end</span></div></div>

</pre>

<p>RSViewAnimationSequenceStep encapsulates handling the beginning and ending of an animation, and then calls back to a delegate when complete. It is a self contained item that can be used independently. If so desired, we could stop here and have client code declare the RSViewAnimationSequenceStep, set the delegate to self, and achieve a large part of the refactoring. But the steps would still be spread apart in the code. That&#8217;s where the RSSequenceManager, and it&#8217;s implementation detail class RSSequence, comes into play, as those two handle chaining the steps together to encapsulate the entire animation.</p>

<h3>RSSequenceManager</h3>

<pre>

<div class="codecolorer-container objc blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@implementation</span> RSSequenceManager<br />
<br />
<span style="color: #11740a; font-style: italic;">// things removed for brevity</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invokeSequence<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> steps<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; RSSequence<span style="color: #002200;">*</span> sequence <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>RSSequence sequenceWithSteps<span style="color: #002200;">:</span> steps delegate<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>sequences_ addObject<span style="color: #002200;">:</span> sequence<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>sequences_ count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span> <span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>sequence invoke<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> sequenceCompleted<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>RSSequence<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> sequence<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>sequences_ removeObject<span style="color: #002200;">:</span> sequence<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>sequences_ count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&amp;</span>gt; <span style="color: #2400d9;">0</span> <span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>sequences_ objectAtIndex<span style="color: #002200;">:</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> invoke<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #a61390;">@end</span></div></div>

</pre>

<p>The bulk of the work, however, happens inside the RSSequence class:</p>

<h3>RSSequence</h3>

<pre>

<div class="codecolorer-container objc blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@interface</span> RSSequence <span style="color: #002200;">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">int</span> &nbsp; &nbsp; &nbsp; &nbsp; currentStepIndex_;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a><span style="color: #002200;">*</span>&nbsp; &nbsp; steps_;<br />
&nbsp; &nbsp; <span style="color: #a61390;">id</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delegate_;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithSteps<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> steps delegate<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> delegate;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invoke;<br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Called to initiate the sequence. </span><br />
&nbsp; &nbsp; <br />
<span style="color: #a61390;">@end</span><br />
<br />
<span style="color: #a61390;">@interface</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <span style="color: #002200;">&#40;</span>RSSequenceDelegate<span style="color: #002200;">&#41;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> sequenceCompleted<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>RSSequence<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> sequence;<br />
<br />
<span style="color: #a61390;">@end</span><br />
<br />
<br />
<span style="color: #a61390;">@implementation</span> RSSequence<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> initWithSteps<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> steps delegate<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> delegate;<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> self <span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; steps_ <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>steps retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span> RSSequenceStep<span style="color: #002200;">*</span> step <span style="color: #a61390;">in</span> steps_ <span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; step.delegate <span style="color: #002200;">=</span> self;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #a61390;">return</span> self;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>steps_ release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invoke<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> beginIgnoringInteractionEvents<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; currentStepIndex_ <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self invokeNextStep<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> invokeNextStep<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> currentStepIndex_ <span style="color: #002200;">&amp;</span>lt; <span style="color: #002200;">&#91;</span>steps_ count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; RSSequenceStep<span style="color: #002200;">*</span> step <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>steps_ objectAtIndex<span style="color: #002200;">:</span> currentStepIndex_<span style="color: #002200;">++</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>step invoke<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">else</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> endIgnoringInteractionEvents<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>delegate_ sequenceCompleted<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stepCompleted<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>RSSequenceStep<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> step<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self invokeNextStep<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@end</span></div></div>

</pre>

<p>The sequence manager doesn&#8217;t know or care that a sequence is an animation, and a sequence also doesn&#8217;t know or care what an individual sequence step does. Those classes only assume that a sequence step&#8217;s ending can, but doesn&#8217;t have to, come later than its beginning. Given that, we&#8217;ve also implemented other sequence step subclasses: one that is a simple selector call, one that encapsulates multiple simultaneous steps, and one that handles openGL animations. I&#8217;ve pared the code down a fair bit for this posting, and left out detail &#8212; for example, our view animation step handles delays, custom timing functions, and transitions. But the basic idea is all there. </p>

<p>Lastly, <a href="http://bignerdranch.com/instructors/conway.shtml">Joe Conway</a> over at the <a href="http://bignerdranch.com/">Big Nerd Ranch</a> posted a <a href="http://weblog.bignerdranch.com/?p=215">blog</a> about this problem, and described a solution using a subclass of CALayer that calls completion targets for a given animation key. I like his approach because it theoretically handles all the different kinds of animations, and I&#8217;ll be thinking about how to work his idea into our sequences.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.roguesheep.com/2009/12/11/iphone-animation-sequence/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New Apps &#8211; Word Spin Lite and Holiday ~ Postage</title>
		<link>http://blog.roguesheep.com/2009/12/08/new-apps-word-spin-lite-and-holiday-postage/</link>
		<comments>http://blog.roguesheep.com/2009/12/08/new-apps-word-spin-lite-and-holiday-postage/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 01:04:14 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Postage]]></category>
		<category><![CDATA[RogueSheep]]></category>
		<category><![CDATA[Word Spin]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.roguesheep.com/?p=147</guid>
		<description><![CDATA[We have two new iPhone applications in the store this month that you might want to check out: Holiday ~ Postage First, Holiday ~ Postage is a special holiday themed edition of our virtual Postcard application &#8211; Postage. It has 10 great new postcard designs and the whole application interface is themed for the season. [...]]]></description>
			<content:encoded><![CDATA[<p>We have two new iPhone applications in the store this month that you might want to check out:</p>

<p><strong>Holiday ~ Postage</strong></p>

<p>First, <a href="http://postage.roguesheep.com/holiday/">Holiday ~ Postage</a> is a special holiday themed edition of our virtual Postcard application &#8211; <a href="http://postage.roguesheep.com/">Postage</a>. It has 10 great new postcard designs and the whole application interface is themed for the season. You&#8217;ll love the new snow globe design if you haven&#8217;t seen it yet. You can get it on the <a href="http://itunes.apple.com/us/app/holiday-postage/id339409897?mt=8">App Store</a> now for just $1.99</p>

<div style="text-align:center;"><img src="http://blog.roguesheep.com/wp-content/uploads/2009/12/HolidayPostage.png" alt="HolidayPostage.png" border="0" width="207" height="385" /></div>

<p><strong>Word Spin Lite</strong></p>

<p>We have also released <a href="http://itunes.apple.com/us/app/id336651776?mt=8">Word Spin Lite</a>, a free edition of our highly addictive word game created in partnership with <a href="http://www.geospaceplay.com/">Geospace International</a> </p>

<p>Word Spin Lite has the same engine as the full version of <a href="http://wordspin.roguesheep.com/">Word Spin</a> and allows you to play challenges that created by your friends or practice the game. You can upgrade Word Spin Lite to the full version right inside the application. After you upgrade you&#8217;ll be able to create your own challenges, as well as play the full Solitaire game and compete for a spot on the global leader board.</p>

<p>
Its free to try, so go ahead and give it a shot! Here are a couple of challenge codes you can try out with Word Spin Lite :
</p>

<p><strong>4 Wheels, 4 Rounds :</strong> <a href="wordspin://challenge/UNQKQI">UNQKQI</a></p>

<p><strong>8 Wheels, 1 Round : </strong><a href="wordspin://challenge/KRRXDX">KRRXDX</a>
</p>

<p>Click the links above if you are on an iPhone with Word Spin installed, otherwise you can just type in the six letter code into the Challenge screen. </p>

<div style="text-align:center;"><img src="http://blog.roguesheep.com/wp-content/uploads/2009/12/WordSpin.png" alt="WordSpin.png" border="0" width="385" height="207" /></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.roguesheep.com/2009/12/08/new-apps-word-spin-lite-and-holiday-postage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

