iPhone UIViewanimation最佳实践

什么被认为是animation视图转换在iPhone上的最佳做法?

例如,苹果的ViewTransitions示例项目使用如下代码:

 CATransition *applicationLoadViewIn = [CATransition animation]; [applicationLoadViewIn setDuration:1]; [applicationLoadViewIn setType:kCATransitionReveal]; [applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; [[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal]; 

但是也有一些漂浮在networking中的代码片段,如下所示:

 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.75]; [UIView setAnimationDelegate:self]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES]; [myview removeFromSuperview]; [UIView commitAnimations]; 

什么是最好的方法? 如果你可以提供一个片段,它将不胜感激。

注:我一直无法得到第二种方法正常工作。

从UIView参考的有关beginAnimations:context:方法的部分:

在iPhone OS 4.0及更高版本中不鼓励使用此方法。 您应该使用基于块的animation方法。

例如基于汤姆评论的基于块的animation

 [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]; 

我一直在使用后者的很多不错的轻量级animation。 您可以使用它交叉淡入两个视图,或淡入淡出,或淡出。 你可以像横幅拍摄另一个视图,你可以使视图伸展或缩小…我从开始beginAnimation / commitAnimations获得了很多里程。

不要以为你所能做的就是:

 [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES]; 

这是一个示例:

 [UIView beginAnimations:nil context:NULL]; { [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:1.0]; [UIView setAnimationDelegate:self]; if (movingViewIn) { // after the animation is over, call afterAnimationProceedWithGame // to start the game [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)]; // [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation // [UIView setAnimationDelay:0.50]; // [UIView setAnimationRepeatAutoreverses:YES]; gameView.alpha = 1.0; topGameView.alpha = 1.0; viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height); viewrect2.origin.y = -20; topGameView.alpha = 1.0; } else { // call putBackStatusBar after animation to restore the state after this animation [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)]; gameView.alpha = 0.0; topGameView.alpha = 0.0; } [gameView setFrame:viewrect1]; [topGameView setFrame:viewrect2]; } [UIView commitAnimations]; 

正如你所看到的,你可以玩alpha,帧,甚至视图的大小。 玩耍。 您可能会对其function感到惊讶。

差异似乎是您需要通过animation的控制量。

CATransition方法给你更多的控制,因此更多的东西来设置,例如。 定时function。 作为一个对象,您可以稍后存储它,重构指向它的所有animation以减less重复的代码等。

UIView类方法是常见animation的简便方法,但比CATransition更为有限。 例如,只有四种可能的转换types(向左翻转,向右翻转,curl,向下curl)。 如果你想淡入淡出,你需要深入到CATransition's淡入淡出过程,或者设置一个UIView alpha的显式animation。

请注意,在Mac OS X上的CATransition可以让你指定一个任意的CoreImagefilter作为过渡,但现在你不能在缺lessCoreImage的iPhone上这样CoreImage

我们可以使用这个简单的代码在iOS 5中创buildanimation。

 CGRect imageFrame = imageView.frame; imageFrame.origin.y = self.view.bounds.size.height; [UIView animateWithDuration:0.5 delay:1.0 options: UIViewAnimationCurveEaseOut animations:^{ imageView.frame = imageFrame; } completion:^(BOOL finished){ NSLog(@"Done!"); }]; 

UIView文档中,阅读关于ios4 +的这个函数

 + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion 

无论如何,“块”的方法是现在的一天。 我会解释下面的简单的块。

考虑下面的剪辑。 bug2和bug3是imageViews。 下面的animation描述了延迟1秒后的持续时间为1秒的animation。 bug3从其中心移动到bug2的中心。 一旦animation完成,它将被logging为“中心animation完成!”。

 -(void)centerAnimation:(id)sender { NSLog(@"Center animation triggered!"); CGPoint bug2Center = bug2.center; [UIView animateWithDuration:1 delay:1.0 options: UIViewAnimationCurveEaseOut animations:^{ bug3.center = bug2Center; } completion:^(BOOL finished){ NSLog(@"Center Animation Done!"); }]; } 

希望这是干净的!

我在这个链接中find了一个很好的教程。 希望这对一些人有帮助。

UIView的animation教程

这里是平滑animation代码,可能对许多开发人员有帮助。
我从本教程中find了这段代码。

 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [animation setAutoreverses:YES]; [animation setFromValue:[NSNumber numberWithFloat:1.3f]]; [animation setToValue:[NSNumber numberWithFloat:1.f]]; [animation setDuration:2.f]; [animation setRemovedOnCompletion:NO]; [animation setFillMode:kCAFillModeForwards]; [[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation. 

对于Swift 3 …

  UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: { myview.removeFromSuperview() }, completion: nil)