【问题标题】:iOS 11 animated gif display in UIImageViewUIImageView 中的 iOS 11 动画 gif 显示
【发布时间】: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
}

这应该如何工作?

【问题讨论】:

    标签: ios animation uiimageview animated-gif ios11


    【解决方案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 类。关键是不需要第三方代码(除了苹果不断地把自己的代码放上去又把它取下来,这有点疯狂)。
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2013-03-14
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多