iPhone UIView动画最佳实践

时间:2009-03-10 13:52:59

标签: iphone ios cocoa-touch uiview core-animation

在iPhone上设置动画视图过渡的最佳做法是什么?

例如,Apple的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];

最好的方法是什么?如果你也可以提供一个片段,那就非常感激了。

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

9 个答案:

答案 0 :(得分:118)

关于beginAnimations:context:方法的UIView reference部分:

  

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

例如基于Tom的评论的基于块的动画

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

答案 1 :(得分: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,框架甚至是视图的大小。玩转。你可能会对它的能力感到惊讶。

答案 2 :(得分:52)

差异似乎是动画需要的控制量。

CATransition方法可以让您获得更多控制权,因此可以设置更多内容,例如。计时功能。作为一个对象,你可以将它存储起来以供日后使用,重构以将所有动画指向它以减少重复的代码等。

UIView类方法是常见动画的便捷方法,但比CATransition更受限制。例如,只有四种可能的过渡类型(向左翻转,右翻,向上卷曲,向下卷曲)。如果您想要淡入淡出,则必须深入研究CATransition's淡入淡出过渡,或者设置UIView的alpha版的明确动画。

请注意,Mac OS X上的CATransition将允许您指定一个用作过渡的任意CoreImage过滤器,但就目前而言,您无法在缺少{的iPhone上执行此操作{1}}。

答案 3 :(得分: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!");
    }];

答案 4 :(得分:8)

UIView文档中,阅读 ios4 +

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

答案 5 :(得分:6)

无论如何,“Block”方法现在已经过了一天。我将在下面解释简单的块。

考虑下面的剪辑。 bug2和bug 3是imageViews。下面的动画描述了延迟1秒后持续1秒​​的动画。 bug3从它的中心移动到bug2的中心。动画完成后,将记录“Center Animation Done!”。

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

希望这很干净!!!

答案 6 :(得分:4)

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

uiview-animation-tutorial

答案 7 :(得分:2)

以下是平滑动画代码,可能对许多开发人员有所帮助 I found this snippet of code from this tutorial.

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.

答案 8 :(得分:2)

让我们试试看看Swift 3 ......

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