当前位置:  开发笔记 > IOS > 正文

iPhone UIView动画最佳实践

如何解决《iPhoneUIView动画最佳实践》经验,为你挑选了6个好方法。

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

例如,ViewTransitions来自apple 的示例项目使用如下代码:

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

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

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



1> Rafael Vega..:

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

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

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

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


是的,Yar是对的.这就是块动画的样子:`[UIView transitionWithView:mysuperview持续时间:0.75选项:UIViewAnimationTransitionFlipFromRight动画:^ {[myview removeFromSuperview]; } completion:nil]`查看UIView文档了解详细信息.
@Steven N,不,它意味着在'UIView`上使用基于块的动画.它们与`beginAnimations`和朋友基本相同,但使用块/闭包功能.
所以..要明确,这意味着使用第一种方法(CATransition),而不是第二种方法?
除非你想支持3.1.3手机.然后不要使用块.
是的,这是第一种方法(CATransition).

2> mahboudz..:

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



3> Ryan McCuaig..:

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

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

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

请注意,CATransition在Mac OS X上,您可以指定一个任意CoreImage过滤器用作过渡,但就像现在一样,您无法在缺少iPhone的iPhone上执行此操作CoreImage.


请注意,这是iOS 2.0时代的建议.如果您使用的是iOS 4.0或更高版本,请参阅Rafael Vega对基于块的方法的回答.

4> Guru..:

我们可以使用这个简单的代码在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!");
    }];


这在iOS 4中也可用,并且被称为"基于块"的动画.它不仅限于iOS 5及更高版本.

5> Chris..:

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

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



6> Deepukjayan..:

无论如何,"阻止"方法现在是优先考虑的.我将在下面解释简单的块.

考虑下面的剪辑.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!");
                 }];
}

希望干净!!!


您将CGPoint bug3.center分配给bug3Center,之后您将CGPoint bug2.center分配给同一个变量bug3Center?你为什么这样做?
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有