我有一个数据输入应用程序,它让用户在导航控制器的不同视图中输入大约 6 条信息。这很好用,但是一旦用户习惯了应用程序,下一个屏幕出现所需的时间就会减慢用户的速度。
我尝试了没有动画的应用程序,但感觉不太对劲。有没有办法让动画更快地发生?我主要使用导航控制器、表格视图和选择器视图。
我有一个数据输入应用程序,它让用户在导航控制器的不同视图中输入大约 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 意识到了这些问题。关闭某些对象的透明度似乎是错误的,但值得一试,看看它是否真的有效。滚动单元格的大部分成本是单元格移动时的合成,而不是最初创建单元格。
另一件可以帮助的事情是预先合成您应用到单元格的视图,而不是将所有视图添加到单元格,然后您只将一个预制视图应用到您的单元格。
如果您实际上是在滚动单元格中为视图设置动画,您可能需要重新考虑这一点,或者至少使用一些简化来减少对设备的负担。
你也可以考虑采用Matt Gallagher 的单元格处理策略——它可以阻止你的 cellForRowAtIndexPath 变成一个冗长的、讨厌的 ifs 集。