I put this here so I have a quick and simple example to refer to in the future :)
- (void)shakeToolbar { static BOOL performingAnimation = NO; if (!performingAnimation) { performingAnimation = YES; // Make an image view to animate // Probably not necessary when animation only "position" // property, but if animating its size, transform or some // property that will need its subviews to layout is more // efficient to do it like this. UIGraphicsBeginImageContext(toolbar.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); [self.view.layer renderInContext:context]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *imageToAnimate; imageToAnimate = [[UIImageView alloc] initWithImage:img]; imageToAnimate.frame = toolbar.frame; // Replace the toolbar with the image view temporarily [toolbar.superview addSubview:imageToAnimate]; toolbar.hidden = YES; [imageToAnimate release]; // Build the animation CGPoint pos = toolbar.layer.position; CGMutablePathRef shakePath = CGPathCreateMutable(); CGPathMoveToPoint(shakePath, NULL, pos.x, pos.y); CGPathAddLineToPoint(shakePath, NULL, pos.x - 5, pos.y); CGPathAddLineToPoint(shakePath, NULL, pos.x + 4, pos.y); CGPathAddLineToPoint(shakePath, NULL, pos.x - 3, pos.y); CGPathAddLineToPoint(shakePath, NULL, pos.x + 2, pos.y); CGPathAddLineToPoint(shakePath, NULL, pos.x - 1, pos.y); CGPathCloseSubpath(shakePath); const float durationOfShake = 0.5; CAKeyframeAnimation *shakeAni; shakeAni = [CAKeyframeAnimation animationWithKeyPath: @"position"]; shakeAni.path = shakePath; shakeAni.duration = durationOfShake; CFRelease(shakePath); // Perform the animation [imageToAnimate.layer addAnimation:shakeAni forKey:@"shakeAnimation"]; // Restore the toolbar to its original state when finished // (Probably is better to do this in the delegate method ... ) dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, durationOfShake * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ toolbar.hidden = NO; [imageToAnimate removeFromSuperview]; performingAnimation = NO; }); } }
0 comments :
Post a Comment