最佳实践

在 iPhone 上动画视图转换的最佳实践是什么?

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

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

但是网络上也有这样的代码片段:

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

什么是最好的方法? 如果你能提供一个片段也将非常感谢。

注意: 我无法让第二种方法正确工作。

213816 次浏览

区别似乎在于您需要对动画进行多少控制。

CATransition方法提供了更多的控制,因此需要设置更多的东西,例如计时函数。作为一个对象,您可以将其存储以备后用,重构以将所有动画指向它以减少重复的代码,等等。

UIView类方法是常见动画的便利方法,但是比 CATransition更受限制。例如,只有四种可能的转换类型(向左翻转、向右翻转、向上卷曲、向下卷曲)。如果你想做一个淡入,你必须要么挖掘到 CATransition's淡入过渡,或设置一个明确的动画你的 UIView的阿尔法。

请注意,Mac OS X 上的 CATransition允许您指定一个任意的 CoreImage过滤器来用作转换,但是就目前的情况而言,您不能在缺少 CoreImage的 iPhone 上这样做。

我已经在许多漂亮的轻量级动画中使用了后者。您可以使用它交叉淡出两个视图,或淡出一个在前面的另一个,或淡出。你可以像拍横幅一样拍另一个视图,你可以使视图拉伸或缩小... 我从 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、框架甚至视图的大小。随便玩玩。你可能会对它的能力感到惊讶。

来自 UIView 参考关于 beginAnimations:context:方法的部分:

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

例如基于汤姆评论的块动画

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

UIView文档中,读取 Ios4 + 的这个函数

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

我们可以使用这个简单的代码在 ios 5中动画图像。

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!");
}];

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

考虑下面的剪辑。Bug 2和 bug 3是 image 视图。下面的动画描述了一个动画1秒后延迟1秒的持续时间。Bug 3从它的中心移动到 bug 2的中心。一旦动画完成,它将被记录为“中心动画完成!”.

-(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!");
}];
}

下面是平滑动画的代码。
我在本教程中找到了这段代码。

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.

让我们尝试结账吧:

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