Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone动画最佳实践_Iphone_Uiimageview - Fatal编程技术网

Iphone动画最佳实践

Iphone动画最佳实践,iphone,uiimageview,Iphone,Uiimageview,我正在做一些测试,试图找到向UIImageView添加小动画的最佳方法 但是,当第一次调用下面的代码时,可能会出现延迟,我猜动画正在加载。如何加载动画以避免此延迟?当第二次调用时,它会立即启动。此代码位于-(void)loadView方法和[animation startAnimating]中;从自定义方法调用注意:UIImageView*动画实际上是一个实例变量。 NSString *imageName; NSMutableArray *animImages = [[NSMutableArra

我正在做一些测试,试图找到向UIImageView添加小动画的最佳方法

但是,当第一次调用下面的代码时,可能会出现延迟,我猜动画正在加载。如何加载动画以避免此延迟?当第二次调用时,它会立即启动。此代码位于-(void)loadView方法和[animation startAnimating]中;从自定义方法调用注意:UIImageView*动画实际上是一个实例变量。

NSString *imageName;
NSMutableArray *animImages = [[NSMutableArray alloc]init];

for(int i = 0; i <= 40; i++) {
    imageName = [NSString stringWithFormat:@"frame_%d.png", i];
    [animImages addObject:[UIImage imageNamed:imageName]];
}

UIImageView *animation; // is actually an instant var declared in header.

animation = [[UIImageView alloc]initWithFrame:CGRectMake(50, 0, 600, 300)];
animation.animationImages = animImages;
animation.animationDuration = 2;
animation.animationRepeatCount = 1;
NSString*imageName;
NSMutableArray*animImages=[[NSMutableArray alloc]init];

对于(int i=0;i更喜欢在viewDidLoad而不是loadView中加载资源。您应该在viewDidUnload中丢弃它们,如果您的视图再次加载,在viewDidLoad中加载将使它们返回

有人可能会争辩说,您也可以在didReceiveMemoryWarning中丢弃它们,但应使用AFAIK viewDidUnload来释放UI元素。如果您使用didReceiveMemoryWarning,您可以通过仅在调用viewDidUnload时释放来检查viewDidLoad是否会再次调用:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    if (![self isViewLoaded]) {
        // release resources
    }
}
但是如果动画是实例变量,而你真的在这样做

UIImageView *animation = [[UIImageView alloc]initWithFrame:CGRectMake(50, 0, 600, 300)];
您设置的不是intance变量,而是本地变量

以后


至于延迟:无论你做什么,加载40幅图像都需要时间。如果你不想在UI中出现延迟,请在后台加载它们,并在延迟完成时通知UI。在这段时间内,你可以显示一些可以吸引人们注意的内容。

感谢内存信息。我认为因为我没有使用Nib,所以这是最好的放置UI代码的位置?必须对此进行研究。UIImageView*动画在我的实际代码中是一个正确的实例变量,但是我没有合成它,是吗?我只是在前面的代码中将其作为一个示例,如注释所述。我真的应该在示例代码中编写它。我的不好。你不需要合成,你不是要从外部访问它。对于类本身来说,一个实例变量就足够了。关于何时加载的规则只是约定,如果你需要,打破它们,并知道你在做什么。例如,如果你不需要在内存警告中扔掉动画,因为你的应用程序在没有它们的情况下无法工作,那么就不需要考虑在哪里加载它和在哪里卸载-它们总是在那里。对于延迟,请参阅问题中的注释。