在按下 UIButton 之前预加载动画图像

Posted

技术标签:

【中文标题】在按下 UIButton 之前预加载动画图像【英文标题】:Preload animation images before UIButton is pressed 【发布时间】:2013-12-15 05:34:42 【问题描述】:

我在视图控制器上有 5 个动画。这已经是非常内存密集型的,因为它们是视网膜质量。

这是我的密码

//Panel 1 Animation
    NSArray *panel1Frames = [NSArray array];
    panel1Frames = [[NSArray alloc] initWithObjects:
                 [UIImage imageNamed:@"origami_panel010001.png"],
                 [UIImage imageNamed:@"origami_panel010002.png"],
                 [UIImage imageNamed:@"origami_panel010004.png"],
                 [UIImage imageNamed:@"origami_panel010005.png"],
                 [UIImage imageNamed:@"origami_panel010006.png"],
                 [UIImage imageNamed:@"origami_panel010007.png"],
                 [UIImage imageNamed:@"origami_panel010008.png"],
                 [UIImage imageNamed:@"origami_panel010009.png"],
                 [UIImage imageNamed:@"origami_panel010010.png"],
                 [UIImage imageNamed:@"origami_panel010011.png"],
                 [UIImage imageNamed:@"origami_panel010012.png"],
                 [UIImage imageNamed:@"origami_panel010013.png"],
                 [UIImage imageNamed:@"origami_panel010014.png"],
                 [UIImage imageNamed:@"origami_panel010015.png"],
                 [UIImage imageNamed:@"origami_panel010016.png"],
                 [UIImage imageNamed:@"origami_panel010017.png"],
                 [UIImage imageNamed:@"origami_panel010018.png"],
                 [UIImage imageNamed:@"origami_panel010019.png"],
                 [UIImage imageNamed:@"origami_panel010020.png"],
                 [UIImage imageNamed:@"origami_panel010021.png"],
                 [UIImage imageNamed:@"origami_panel010022.png"],
                 [UIImage imageNamed:@"origami_panel010023.png"],
                 [UIImage imageNamed:@"origami_panel010024.png"],
                 [UIImage imageNamed:@"origami_panel010025.png"],
                 [UIImage imageNamed:@"origami_panel010026.png"],
                 [UIImage imageNamed:@"origami_panel010027.png"],
                 [UIImage imageNamed:@"origami_panel010028.png"],
                 [UIImage imageNamed:@"origami_panel010029.png"],
                 [UIImage imageNamed:@"origami_panel010030.png"],
                 [UIImage imageNamed:@"origami_panel010031.png"],
                 [UIImage imageNamed:@"origami_panel010032.png"],
                 [UIImage imageNamed:@"origami_panel010033.png"],
                 [UIImage imageNamed:@"origami_panel010034.png"],
                 [UIImage imageNamed:@"origami_panel010035.png"],
                 [UIImage imageNamed:@"origami_panel010036.png"],
                 [UIImage imageNamed:@"origami_panel010037.png"],
                 [UIImage imageNamed:@"origami_panel010038.png"],
                 [UIImage imageNamed:@"origami_panel010039.png"],
                 [UIImage imageNamed:@"origami_panel010040.png"],
                 [UIImage imageNamed:@"origami_panel010041.png"],
                 [UIImage imageNamed:@"origami_panel010042.png"],
                 [UIImage imageNamed:@"origami_panel010043.png"],
                 [UIImage imageNamed:@"origami_panel010044.png"],
                 [UIImage imageNamed:@"origami_panel010045.png"],
                 [UIImage imageNamed:@"origami_panel010046.png"],
                 [UIImage imageNamed:@"origami_panel010047.png"],
                 [UIImage imageNamed:@"origami_panel010048.png"],
                 [UIImage imageNamed:@"origami_panel010049.png"],
                 [UIImage imageNamed:@"origami_panel010050.png"],
                 [UIImage imageNamed:@"origami_panel010051.png"],
                 [UIImage imageNamed:@"origami_panel010052.png"],
                 [UIImage imageNamed:@"origami_panel010053.png"],
                 [UIImage imageNamed:@"origami_panel010054.png"],
                 [UIImage imageNamed:@"origami_panel010055.png"],
                 [UIImage imageNamed:@"origami_panel010056.png"],
                 [UIImage imageNamed:@"origami_panel010057.png"],
                 [UIImage imageNamed:@"origami_panel010058.png"],
                 [UIImage imageNamed:@"origami_panel010059.png"],
                 [UIImage imageNamed:@"origami_panel010060.png"],
                 [UIImage imageNamed:@"origami_panel010061.png"],
                 [UIImage imageNamed:@"origami_panel010062.png"],
                 [UIImage imageNamed:@"origami_panel010063.png"],
                 [UIImage imageNamed:@"origami_panel010064.png"],
                 [UIImage imageNamed:@"origami_panel010065.png"],
                 nil];
    panel1Image.animationImages = panel1Frames;
    panel1Image.animationDuration = 3.0;
    panel1Image.animationRepeatCount = 1;

这是在按下 UIButton 时加载的,是否可以事先加载图像?

此外,有没有办法让它一次只能播放一个动画?这会减少使用的内存量吗?

谢谢!

【问题讨论】:

【参考方案1】:

您的问题是 ios 将图像的实际加载推迟到需要渲染它们。而不是你所拥有的,创建一个名称数组,遍历它们,像现在一样创建一个图像,向它询问它的 CGImage,然后使用它来创建另一个你保存在可变数组中的 uiimage。如果这对您有用,请添加评论,那么规模会很微妙。

如果您担心总内存,可以将 uiimages 放在 NSCache 中。

如果您只想播放一个动画,则在播放一个动画时将其他按钮上的启用设置为关闭。

编辑:如果您真的无法克服记忆的问题,请创建一个演示项目,每个按钮按下一个动画并将其发布到公共站点,然后使用对该项目的引用更新您的原始问题。

【讨论】:

最大的问题似乎是总内存,我将最终的图像面板更新为视网膜,现在每次都崩溃,我怎样才能将它们放入 NSCache 中?这可能就是我所需要的。谢谢。 阅读 NSCache——它就像一个 NSSet 但系统可以删除对象,所以当你去获取图像时它可能会消失(然后你必须从文件系统中读取它)。另外,我看到你所有的图像都是 png - 这些通常比慢跑大得多。我建议更换一些,看看大小差异是多少。您也许可以使用 CADisplay 循环制作自己的动画,并更新您自己的图像视图。这样,您可以简单地保留一些图像,然后再显示您需要显示的原因。这一切都不是简单的 - 您需要完成工作所需的大图像动画。也许拍一部电影? 我尝试了整个电影路线,但它看起来很笨重,不像流线型。动画路线对我来说效果很好。我实际上已经完成了我需要完成的所有功能。现在只是内存的这个问题。你说的慢跑是指jpg吗?哈:)我也会试试这个!是否有您可以推荐的链接或资源,以便我可以阅读 NSCache?我对 Xcode 比较陌生。感谢您对我的问题感兴趣!我想在你的帮助下,我可以解决这个问题。谢谢。 嗯 - 拼写正确改变了我。是的jpeg。 NSCache 的使用是一个高级主题。如果您在 Mac 上的 Preview 中将 png 转换为 jpeg,您可以指定一个非常低的“质量”,获得很好的压缩,并且感知到的差异非常小。此外,通过一些时间的努力(或像 Screeny 这样的好工具,您可以像动画一样以精确的间隔制作具有过渡的电影,但由于每个图像都接近前面的图像,您可以“免费”获得大量压缩.YMMV 我必须有 5 部单独的电影,因为我希望该用户能够单独重播每个部分。电影我得到了公平的方式,但是自从使用动画以来,我唯一无法做的就是解决这个内存问题,我拥有我想要的所有其他功能(只是仍然要修复声音问题),我会尝试jpg,我会在 NSCache 上阅读。

以上是关于在按下 UIButton 之前预加载动画图像的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中按下 uibutton 时更改色调图像颜色

Spotify API,预加载封面艺术

纯色背景上的透明透明预加载器图像

在 SpriteKit 中预加载纹理

如何在按下其他 UIButton 时触发 UIButton 的“按下效果”或“突出显示效果”

UIImageView 动画预加载