我有一个数据输入应用程序,用户可以在导航控制器中的不同视图中输入大约6条信息。这样可以正常工作,但是一旦用户习惯了应用程序,下一个屏幕出现所需的时间就会减慢用户的速度。

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

有帮助吗?

解决方案

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

您也可以自己将每个视图添加为子视图,在这种情况下,您可以控制动画持续时间等。这段代码会为你做这件事,虽然要小心,因为我刚写了它并没有测试它(转换样式和布尔参数可以删除,因为它们现在什么都不做)。

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

其他提示

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

请注意透明度在单元格中可能产生的性能损失。通常看起来你必须让事情变得透明,但也许你没有,因为UITableViewCell意识到了这些问题。关闭某些对象的透明度似乎是错误的,但值得尝试看看它是否真的有效。滚动单元格的大部分成本是在单元格移动时合成,而不是最初创建单元格。

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

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

您也可以考虑采用马特·加拉格尔的策略细胞处理 - 它会阻止你的cellForRowAtIndexPath变成一组冗长,令人讨厌的ifs。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top