UIImageView 中的 iOS 11 动画 gif 显示

Posted

技术标签:

【中文标题】UIImageView 中的 iOS 11 动画 gif 显示【英文标题】:iOS 11 animated gif display in UIImageView 【发布时间】:2018-01-26 11:28:31 【问题描述】:

我认为 ios 11 应该最终带来对动画 GIF 的原生支持?但是我试过这个,我没有看到任何动画:

let im = UIImage(named:"wireframe.gif")!
let iv = UIImageView(image:im)
iv.animationImages = [im] // didn't help
iv.frame.origin = CGPoint(0,100)
iv.frame.size = im.size
self.view.addSubview(iv)
delay(2) 
    iv.startAnimating() // nope

这应该如何工作?

【问题讨论】:

【参考方案1】:

iOS 11 确实带来了对动画 gif 的原生理解,但令人恼火的是,这种理解并没有内置到 UIImageView 中。 仍然可以将动画 gif 转换为 UIImage 序列。 Apple 现在提供了关于 ImageIO 框架的示例代码:

https://developer.apple.com/library/content/samplecode/UsingPhotosFramework/Listings/Shared_AnimatedImage_swift.html

该代码实现了一个 AnimatedImage 类,它本质上是从原始动画 gif 中提取的 CGImage 集合。因此,使用该类,我们可以在 UIImageView 中显示和制作动画 gif,如下所示:

let url = Bundle.main.url(forResource: "wireframe", withExtension: "gif")!
let anim = AnimatedImage(url: url)!
var arr = [CGImage]()
for ix in 0..<anim.frameCount 
    arr.append(anim.imageAtIndex(index: ix)!)

var arr2 = arr.map UIImage(cgImage:$0)
let iv = UIImageView()
iv.animationImages = arr2
iv.animationDuration = anim.duration
iv.frame.origin = CGPoint(0,100)
iv.frame.size = arr2[0].size
self.view.addSubview(iv)
delay(2) 
    iv.startAnimating()

【讨论】:

那个链接是404。这个功能被删除了吗? 好的,谢谢。很奇怪。如果我理解正确,那么通过直接查询ImageIO,就可以在动画.gif 中获取各个图像。我真的不知道 iOS 11 有什么新功能。 网址又坏了 @ShaneNeuville 是的,我也注意到了。苹果似乎无法对此做出决定。他们把代码从袋子里拿出来——从而鼓励我们这样做——现在他们试图把它塞回去。基本上他们似乎根本不希望我们显示动画 gif。 嗨@Crashalot! — 现在 Apple 已经撤回了其官方代码,我们又回到了使用第三方库(其中有很多)。我认为这里的想法可能是动画 gif 可能会占用大量内存,而 Apple 只是不想鼓励人们使用它们......【参考方案2】:

不幸的是,GIF 的帧间时间可能因帧而异,因此使用 ImageIO 加载帧然后将它们设置为 UIImageView 上的动画图像的答案需要正确提取时间并将其考虑在内。

我推荐 Flipboard 的 FLAnimatedImage,它可以正确处理 GIF。 https://github.com/Flipboard/FLAnimatedImage.

【讨论】:

我完全同意。但我引用的 Apple 示例代码还包括一个正确执行此操作的 AnimatedImageView 类。关键是不需要第三方代码(除了苹果不断地把自己的代码放上去又把它取下来,这有点疯狂)。

以上是关于UIImageView 中的 iOS 11 动画 gif 显示的主要内容,如果未能解决你的问题,请参考以下文章

带约束的 UIImageView 的 iOS 动画

iOS:UIImageView 不响应动画之间的点击手势

iOS翻转UIImageView 180度(非动画)

iOS UIImageView 没有动画

带有透明 UIImageView (iOS) 的页面卷曲动画

UIImageView 是不是具有指示 setImage 已完成且动画已准备好的属性?