142

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

例如,ViewTransitionsapple 的示例项目使用如下代码:

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];

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

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

4

8 回答 8

119

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

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

例如基于 Tom's Comment 的基于块的动画

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
于 2010-08-09T15:02:30.417 回答
69

我一直在使用后者来制作很多漂亮的轻量级动画。您可以使用它交叉淡入淡出两个视图,或将一个淡入另一个视图,或将其淡出。您可以像横幅一样拍摄另一个视图,可以拉伸或缩小视图...我从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、帧,甚至视图的大小。到处玩。您可能会对它的功能感到惊讶。

于 2009-05-04T08:22:52.517 回答
52

不同之处似乎在于您需要对动画进行控制。

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

类方法是常见动画的UIView便捷方法,但比CATransition. 例如,只有四种可能的过渡类型(向左翻转、向右翻转、向上卷曲、向下卷曲)。如果你想做一个淡入,你必须要么向下挖掘淡入淡出过渡,要么为你的 alphaCATransition's设置一个明确的动画。UIView

请注意,CATransition在 Mac OS X 上,您可以指定任意CoreImage过滤器用作过渡,但就目前而言,您无法在缺少CoreImage.

于 2009-03-10T15:24:45.003 回答
26

我们可以使用这个简单的代码在 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!");
    }];
于 2012-01-20T09:10:50.820 回答
8

UIView文档中,阅读有关ios4+的此功能

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
于 2011-10-11T10:19:40.520 回答
6

无论如何,现在首选“阻止”方法。我将解释下面的简单块。

考虑下面的片段。bug2 和 bug 3 是 imageViews。下面的动画描述了延迟 1 秒后持续时间为 1 秒的动画。bug3 从它的中心移动到 bug2 的中心。动画完成后,将记录“中心动画完成!”。

-(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!");
                 }];
}
于 2012-03-08T04:12:12.523 回答
2

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

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.
于 2013-07-03T07:19:52.550 回答
2

让我们尝试检查一下 Swift 3:

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
于 2017-03-15T12:50:19.097 回答