jom*_*fer 8 xcode assets swift heif heic
我已经从我的项目中设置.heic了我的xcassets文件夹中的图像以节省一些空间.但是我无法通过UIImage(named:)构造函数加载它们.我总是得到nil,所以我必须加载它们的唯一方法是指定URL.你知道为什么吗?
imageView.image = UIImage(named: "stone") // This returns nil.
Run Code Online (Sandbox Code Playgroud)
再次,如果我将它们作为文件添加到项目中,并通过此方法访问它们,我创建的一切都很好(或使用像SDWebImage这样的库),但我相信我正在失去应用程序细化的强大功能,因为图像作为文件托管因此,例如iPhone 7将只在需要时同时拥有2x和3x分辨率2x.
extension UIImage {
convenience init?(heicName: String, useScale: Bool = false) {
guard let resourcePath = Bundle.main.path(forResource: heicName.fileName(fileExtension: .heic, useScale: useScale), ofType: nil) else {
return nil
}
let url = URL(fileURLWithPath: resourcePath) as CFURL
guard let source = CGImageSourceCreateWithURL(url, nil),
let image = CGImageSourceCreateImageAtIndex(source, 0, nil) else {
return nil
}
self.init(cgImage: image)
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,任何人都可以向我解释使用HEIC作为图像资源文件夹中托管的图像的过程,并使其与app thinning兼容(只需获取所需的资源,即2x,3x)?
更新: 在研究了更多之后,当我在图像视图上设置图像名称时,我意识到图像是从IB加载的.你知道这是如何在内部工作的吗?使用哪个构造函数将UIImage设置为UIImageView?
更新2: 我已向Apple提交雷达: 雷达
苹果的资产编译器以各种内部格式(一些标准格式和一些专有格式)重新编码进入其中的所有图像,具体取决于一系列因素,包括图像类型、目标操作系统版本以及可能的其他因素。不幸的是,在撰写本文时,资产编译器似乎在 HEIC 文件方面存在缺陷;如果我尝试将 HEIC 文件放入资产目录中,它似乎被排除在外。图像数据不会复制到 Assets.car 文件中,该文件本身大小只有 16 KB,仅包含一些空 B 树。因此,当您尝试使用 加载图像时UIImage,您什么也得不到。
幸运的是,由于资产编译器无论如何都会重新编码输入到其中的所有图像,因此您只需将图像重新编码为另一种格式(我推荐 PNG,因为它是无损的),并且最终用户收到的结果文件应该与HEIF 输入文件会是什么样子(讽刺的是,它最终可能被编码为 HEIF,因为资产格式支持它)。所以这就是我会做的,直到苹果修复资产编译器中的这个错误。
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |