Note that there are some explanatory texts on larger screens.

plurals
  1. PORetrigger CABasicAnimation with NSThread in iOS
    text
    copied!<p>I am hacking this Core Animation example: <a href="https://github.com/joericioppo/Shape_05" rel="nofollow">https://github.com/joericioppo/Shape_05</a></p> <p>I want to retrigger the animation in response to an NSThread. The NSLogs show up as expected, but the animation itself does not trigger until all sleeps have completed, even though its method has verifiably been called. How can I retrigger this animation every second?</p> <p>By the way - this is just an example patch I am working on in order to understand the concept. I know that animations can be set to repeat, but this isn't what I want to do, for various reasons. Here's the code, any help would be most welcome, thanks.</p> <pre><code>#import &lt;UIKit/UIKit.h&gt; #import &lt;QuartzCore/QuartzCore.h&gt; @interface Shape_05ViewController : UIViewController { CALayer *rootLayer; CAShapeLayer *shapeLayer; CGMutablePathRef pentagonPath; CGMutablePathRef starPath; int animationCount; CABasicAnimation *animation; } -(void)startAnimation; -(void) viewDidLoad; -(void) startSequence; -(void) enactSequence; @end </code></pre> <hr> <pre><code>#import "Shape_05ViewController.h" @implementation Shape_05ViewController - (void)loadView { UIView *appView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; appView.backgroundColor = [UIColor blackColor]; self.view = appView; [appView release]; rootLayer = [CALayer layer]; rootLayer.frame = self.view.bounds; [self.view.layer addSublayer:rootLayer]; //Pentagon Path pentagonPath = CGPathCreateMutable(); CGPoint center = self.view.center; CGPathMoveToPoint(pentagonPath, nil, center.x, center.y - 75.0); for(int i = 1; i &lt; 5; ++i) { CGFloat x = - 75.0 * sinf(i * 2.0 * M_PI / 5.0); CGFloat y = - 75.0 * cosf(i * 2.0 * M_PI / 5.0); CGPathAddLineToPoint(pentagonPath, nil,center.x + x, center.y + y); } CGPathCloseSubpath(pentagonPath); //This seems to be fixed in 4.0 //Star Path starPath = CGPathCreateMutable(); center = self.view.center; CGPathMoveToPoint(starPath, NULL, center.x, center.y + 75.0); for(int i = 1; i &lt; 5; ++i) { CGFloat x = 75.0 * sinf(i * 4.0 * M_PI / 5.0); CGFloat y = 75.0 * cosf(i * 4.0 * M_PI / 5.0); CGPathAddLineToPoint(starPath, NULL, center.x + x, center.y + y); }; CGPathCloseSubpath(starPath); //Create Shape shapeLayer = [CAShapeLayer layer]; shapeLayer.path = pentagonPath; UIColor *fillColor = [UIColor colorWithWhite:0.9 alpha:1.0]; shapeLayer.fillColor = fillColor.CGColor; shapeLayer.fillRule = kCAFillRuleNonZero; [rootLayer addSublayer:shapeLayer]; } -(void) viewDidLoad { NSLog(@"viewDidLoad"); animationCount = 0; [NSThread detachNewThreadSelector:@selector(startSequence) toTarget:self withObject:nil]; } -(void) startSequence { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [self enactSequence]; //[NSThread sleepForTimeInterval:100]; [pool release]; } -(void) enactSequence { NSLog(@"enactSequence"); for(int i = 0; i &lt; 4; i++) { [NSThread sleepForTimeInterval:1]; [self performSelector:@selector(startAnimation) withObject:nil]; [rootLayer setNeedsDisplay]; NSLog(@"%i", i); }; } -(void)startAnimation { NSLog(@"startAnimation"); animation = [CABasicAnimation animationWithKeyPath:@"path"]; animation.duration = 0.25; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; animation.repeatCount = 0; animation.autoreverses = NO; animation.fillMode = kCAFillModeForwards; animation.removedOnCompletion = YES; if( (animationCount % 2) == 0) { animation.fromValue = (id)pentagonPath; animation.toValue = (id)starPath; } else { animation.fromValue = (id)starPath; animation.toValue = (id)pentagonPath; }; [shapeLayer addAnimation:animation forKey:@"animatePath"]; animationCount++; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)dealloc { CGPathRelease(starPath); CGPathRelease(pentagonPath); [super dealloc]; } @end </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload