尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

为什么 AnimatedGIFImageSerialization 停止维护?iOS 13 迁移到 CGAnimateImageAtURLWithBlock 完整指南

为什么 AnimatedGIFImageSerialization 停止维护?iOS 13 迁移到 CGAnimateImageAtURLWithBlock 完整指南 为什么 AnimatedGIFImageSerialization 停止维护?iOS 13 迁移到 CGAnimateImageAtURLWithBlock 完整指南【免费下载链接】AnimatedGIFImageSerializationComplete Animated GIF Support for iOS, with Functions, NSJSONSerialization-style Class, and (Optional) UIImage Swizzling项目地址: https://gitcode.com/gh_mirrors/an/AnimatedGIFImageSerializationAnimatedGIFImageSerialization 是一款经典的 iOS 动画 GIF 解码/编码库曾在 iOS 13 之前帮助无数开发者让 UIImage 原生支持动图播放。如今它已停止维护官方明确建议升级到系统自带的CGAnimateImageAtURLWithBlock。本文将从它当年解决了什么问题、为什么退役、如何迁移三个角度给出一份面向新手的完整迁移指南。它当年解决了什么痛点在 iOS 13 之前UIImage的默认初始化方法无法解码 GIF 动画文件。开发者调用[UIImage imageNamed:animated.gif]时得到的往往只有第一帧静态画面动画完全不会播放。AnimatedGIFImageSerialization 通过两个核心手段解决了这一难题Swizzling方法交换在load中交换imageNamed:、imageWithData:等初始化方法让 UIImage 悄悄具备 GIF 解码能力。如果不希望自动交换可在编译环境设置ANIMATED_GIF_NO_UIIMAGE_INITIALIZER_SWIZZLING关闭相关逻辑见 AnimatedGIFImageSerialization.m。NSJSONSerialization 风格 API库名和用法都致敬 Foundation 的序列化类提供imageWithData:解码、animatedGIFDataWithImage:编码完整接口声明见 AnimatedGIFImageSerialization.h。集成后一行代码即可播放动图效果如示例中的 animated.gifAnimatedGIFImageSerialization 解码 iOS 动画 GIF 展示效果为什么停止维护原因只有一个库的 README.md 开头就写明了结论This library is no longer maintained. In iOS 13 and macOS 10.15, useCGAnimateImageAtURLWithBlockinstead.停止维护的根本原因是苹果在 iOS 13 / macOS 10.15 中提供了官方原生的 GIF 动画解码 API。当系统能力足以替代第三方方案时继续维护一个基于运行时 swizzling 的库就失去了意义。此外该库还存在一些历史局限依赖 Objective-C runtime 的方法交换与 Swift、SwiftUI 的集成不够优雅采用逐帧解码后拼成animatedImage的方式内存占用偏高项目最后更新停留在 2019 年作者 Mattt 已将重心转向维护更现代化的工具。iOS 13 迁移到 CGAnimateImageAtURLWithBlock 完整指南第一步用系统 API 替代自动解码迁移的核心是移除 swizzling 依赖改用手动调用系统函数。旧代码这样播放 GIFimageView.image [UIImage imageNamed:animated.gif];新代码在 iOS 13 中这样写CGAnimateImageAtURLWithBlock(url, nil, ^(CGImageRef _Nonnull image, CFIndex index) { imageView.image [UIImage imageWithCGImage:image]; });CGAnimateImageAtURLWithBlock会按 GIF 自身的帧间隔逐帧回调不需要自己解析帧数据代码量大幅缩减。第二步替换编码功能如果你还需要把 UIImage 序列化回 GIF旧库的animatedGIFDataWithImage:duration:loopCount:error:可改用CGImageDestination配合kUTTypeGIF实现思路与 AnimatedGIFImageSerialization.m 中的编码逻辑一致只是不再需要经过这个库封装。第三步移除库并清理工程从 Podfile / 工程中删除AnimatedGIFImageSerialization依赖全局搜索并替换UIImageWithAnimatedGIFData、animatedGIFDataWithImage:等 API 调用如果依赖了它的 swizzling 自动解码务必显式调用上述系统 API避免图片静帧。新旧方案对比一览对比项AnimatedGIFImageSerializationCGAnimateImageAtURLWithBlock支持系统iOS 5已过时iOS 13 / macOS 10.15解码方式方法交换 逐帧解码系统原生逐帧回调内存占用较高全部帧载入内存更优按需解码维护状态已停止维护Apple 官方持续支持集成复杂度需处理 swizzling一个函数搞定迁移建议与总结对新手来说这次迁移其实是一次减负不用再理解 runtime swizzling也不用引入第三方依赖苹果把动画 GIF 支持做成了系统能力。如果你仍想研究这个库的实现细节可以 clone 源码阅读git clone https://gitcode.com/gh_mirrors/an/AnimatedGIFImageSerialization最后总结一下AnimatedGIFImageSerialization 停止维护是功成身退它的历史使命已经完成。在 iOS 13 的项目中请直接拥抱CGAnimateImageAtURLWithBlock——更简单、更省内存而且永远不会停止维护。【免费下载链接】AnimatedGIFImageSerializationComplete Animated GIF Support for iOS, with Functions, NSJSONSerialization-style Class, and (Optional) UIImage Swizzling项目地址: https://gitcode.com/gh_mirrors/an/AnimatedGIFImageSerialization创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表