加速 iPhone 动画

Posted

技术标签:

【中文标题】加速 iPhone 动画【英文标题】:Speeding up iPhone animations 【发布时间】:2009-10-22 17:44:30 【问题描述】:

我有一个数据输入应用程序,它让用户在导航控制器的不同视图上输入大约 6 条信息。这很好用,但是一旦用户习惯了应用程序,下一个屏幕出现所花费的时间会减慢用户的速度。

我尝试了没有动画的应用程序,但感觉不太对劲。有没有办法让动画更快地发生?我主要使用导航控制器、表格视图和选择器视图。

【问题讨论】:

【参考方案1】:

每次加载新视图时都会受到惩罚,您可以尝试使用滚动视图或不同的布局来合并屏幕。 此外,如果您正在加载任何不必要的图形,您可能需要删除它们。

您还可以自己将每个视图添加为子视图,在这种情况下,您可以控制动画持续时间等。这段代码会为你做到这一点,但要小心,因为我只是写了它并没有测试它(过渡样式和布尔参数可以删除,因为它们现在什么都不做)。

UIViewControllerExtendedPresentModalViewController.h

#import <Foundation/Foundation.h>

typedef enum _ExtendedModalTransitionStyle

    ExtendedModalTransitionStyleTopDown 
 ExtendedModalTransitionStyle;

@interface UIViewController ( ExtendedPresentModalViewController )
- (void)presentModalViewController: (UIViewController*)modalViewController 
               withTransitionStyle: (ExtendedModalTransitionStyle)style
                          animated: (BOOL)animated;

- (void)dismissModalViewController: (UIViewController*)modalViewController
               withTransitionStyle: (ExtendedModalTransitionStyle)style
                          animated: (BOOL)animated;
@end

UIViewControllerExtendedPresentModalViewController.m

#import "UIViewControllerExtendedPresentModalViewController.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIViewController ( ExtendedPresentModalViewController )

    - (void)presentModalViewController: (UIViewController*)modalViewController 
                   withTransitionStyle: (ExtendedModalTransitionStyle)style
                              animated: (BOOL)animated
    
        [modalViewController retain]; // we'll need this for a little while, hang on to it.

        CATransition* transition = [CATransition animation];
        [transition setDuration: 0.4];
        [transition setTimingFunction: 
         [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];
        [transition setType: kCATransitionMoveIn];
        [transition setSubtype: kCATransitionFromBottom];
        [[[self view] layer] addAnimation: transition 
                                   forKey: nil];
        [[self view] addSubview: [modalViewController view]];
    

    - (void)dismissModalViewController: (UIViewController*)modalViewController
                   withTransitionStyle: (ExtendedModalTransitionStyle)style
                              animated: (BOOL)animated
    
        CATransition* transition = [CATransition animation];
        [transition setDuration: 0.4];
        [transition setTimingFunction: 
         [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];//kCAMediaTimingFunctionEaseInEaseOut]];
        [transition setType: kCATransitionReveal];
        [transition setSubtype: kCATransitionFromTop];
        [[[[modalViewController view] superview] layer] addAnimation: transition 
                                                              forKey: nil];
        [[modalViewController view] removeFromSuperview];

        [modalViewController release]; // all done, we can let this go.
    
    @end

【讨论】:

它会增加您必须做的管理工作,但可以为您提供所需的额外速度。 我没有时间尝试这个特定的代码,但很明显我需要自己完成所有转换(如你所建议的那样),而不是依赖正常行为。跨度> 【参考方案2】:

您是否在表格视图中重复使用单元格?确保真正重用它们,换句话说,在 if(cell==nil) 情况下完成单元格的所有设置,并且仅在常见情况下应用数据(适用于重用和新创建的)。

请注意透明度可能对单元格造成的性能影响。通常,您似乎必须使事情变得透明,但也许您不必这样做,因为 UITableViewCell 意识到了这些问题。关闭某些对象的透明度似乎是错误的,但值得一试,看看它是否真的有效。滚动单元格的大部分成本是单元格移动时的合成,而不是最初创建单元格。

另一件有帮助的事情是预先合成应用到单元格的视图,而不是将所有视图添加到单元格,然后只将一个预制视图应用到单元格。

如果您实际上是在滚动单元格中为视图设置动画,您可能需要重新考虑这一点,或者至少使用一些简化来减少对设备的负担。

您也可以考虑采用Matt Gallagher's strategy for cell handling - 它可以阻止您的 cellForRowAtIndexPath 变成一组冗长、讨厌的 ifs。

【讨论】:

我不认为我的代码存在性能问题——如果我去掉动画,UI 会更加活泼,但不像 iPhone。问题只是动画运行需要一些时间。而不是需要 0.5 秒运行的动画,我希望它在 0.25 秒内运行。这是一个假的例子,让它更清楚。转到日历应用程序并点击右箭头以获取下个月的日历。下个月将在视觉上滑入视野。我的问题是如何让下个月更快地滑入视野。 我现在明白了——我确实看到了这个:everburning.com/news/flicking-the-iphone,但是还有很多手工工作要做。我不认为您可以改变系统转换的速度,例如由 pushViewController:withAnimation 引起的转换速度,从而导致应用程序获得批准。我知道一种访问私有方法的方法,该方法似乎在 3.0 版本中停止工作。

以上是关于加速 iPhone 动画的主要内容,如果未能解决你的问题,请参考以下文章

iPhone的加速器刷新率

将 iPhone 加速度计设置为 ±8g 模式

iphone加速度计速度和距离

在 iPhone 中使用加速度计查找距离

你怎么能得到iphone加速度计的采样率频率?

iPhone - 使用陀螺仪/加速度计检测运动