UIImageView 动画滞后

Posted

技术标签:

【中文标题】UIImageView 动画滞后【英文标题】:UIImageView animation lag 【发布时间】:2011-06-12 09:14:23 【问题描述】:

我的动画有问题。一开始,一切都很顺利。但是,当应用程序运行一段时间(大约 10 分钟)时,动画就会滞后。

这是 viewDidLoad 中的代码:

[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(updateImage) userInfo:nil repeats:YES];

and in -(void)updateImage: //图像淡入

[aSubview release];
[aSubview removeFromSuperview];
aSubview = [[UIImageView alloc] initWithFrame:CGRectMake(28, 64, 265, 284)];
aSubview.image = [slideShowArray objectAtIndex:randNum];
[aSubview setAlpha:0.0];
[UIImageView beginAnimations:NULL context:nil];
[UIImageView setAnimationDuration:2.0];
[aSubview setAlpha:1.0];
[UIImageView commitAnimations];
[self.view addSubview:aSubview];

UIImageView *film = [[UIImageView alloc] initWithFrame:CGRectMake(20, 34, 280, 344)];
film.image = [UIImage imageNamed:@"film5.png"];
[film setAlpha:1.0];
[self.view addSubview:film];
[film release];

谁能解释一下?是内存问题还是其他原因?提前致谢。

【问题讨论】:

什么是slideShow,什么是aSubview 就像其他人提到的那样,这主要是一种记忆。这是整个updateImage: 方法吗? 我已经添加了其余的代码,并稍作修改。 现在您正在删除一个子视图,但仍有电影图像。如果不需要,您也应该像 aSubview 一样删除它们。我已经编辑了我的答案。 问题好像解决了!感谢大家的快速和建设性的回应!这就是我喜欢***的原因!!谢谢你们! 【参考方案1】:
[self.view addSubview:aSubview];

您每 3 秒添加一个子视图。所以 10 分钟后有 200 个子视图需要太多内存,从而降低了应用程序的速度。在添加新的子视图之前,如果不需要,请删除以前的子视图。如果您同时需要 200 个子视图,那么您应该重新考虑您的设计。

编辑:问题编辑后,为什么每次都需要添加film?每次调用该方法时,您都会添加一个新的 film 对象。请注意,超级视图保留子视图。因此,如果该方法被调用 20 次,那么您在内存中有 20 个 film 对象。

【讨论】:

@taskinoor 影片原本是部分代码,我只是修改了问题以展示全班。我添加的[电影发布]会有所帮助吗? 已经+1了。当film 的多个实例甚至没有展开时,没有理由将它们作为子视图。 电影部分是 updateImage 的一部分,每 3 秒调用一次? @taskinoor, @Deepak:我这样做的最初原因是我希望电影图像覆盖 aSubview 图像。也许我应该把它放在 viewDidLoad 中并将 aSubview 图像发送到后面?这个可以吗? 在 viewDidLoad 中添加影片并通过调用 bringSubviewToFront 将其置于最前面。【参考方案2】:

是的,你的问题是随着时间的推移内存聚集。要解决此问题,请使用 Instruments 检查内存使用情况并找出原因。您可能不会释放某些对象。在 XCode 中转到 Product -> Profile 或按“cmd+i”选择“Allocations”并手动添加“Leaks”。运行 Instruments 并尝试调试您的问题。

【讨论】:

【参考方案3】:
[self.view addSubview:aSubview];

上述问题根本不是问题,来自addSubView 的苹果文档。

视图只能有一个超级视图。如果 视图已经有一个超级视图并且 view 不是接收者,这个方法 删除之前的上一个超级视图 使接收器成为其新的超级视图。

动画总是在内存方面的繁重操作,需要在动画前后存储很多东西,这些东西对于应用程序开发人员来说是不可见的。在你的情况下,你做的时间超过了 10 分钟。在一个循环中,这会导致下一个动画操作的内存可用性降低。

【讨论】:

恐怕每次调用updateImage时OP的aSubview都不一样。很有可能每次都有新的图像视图被添加到超级视图中。虽然这不是 100% 确定的问题。 @taskinoor :是的,我们将其称为不好的做法,但不是问题的原因.. 如果添加 200 个不同的子视图,这将是问题的原因。 问题依然存在,所以我又添加了一行:[aSubview removeFromSuperview];正在测试中,希望对您有所帮助。 @taskinoor :这与内存有关,您可以在这里添加 200 个不同的视图。

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

插入 UIImageView 作为子视图滞后

使 UIImageview 根据另一个 UIImageview 旋转而旋转

在 UIScrollView 中放大多个 UIImageView

UIImageView 不显示来自 UITableViewController 的设置图像

更改 UIImageView 大小以匹配图像与 AutoLayout

在 UIScrollView 内的 UIImageView 上启用 GestureRegnizer