我已经从我的项目中的xcassets文件夹中设置了.heic图像以节省一些空间.但是我无法通过UI
Image(命名为:)构造函数加载它们.我总是为零,所以我必须加载它们的唯一方法是指定URL.你知道为什么吗?
imageView.image = UIImage(named: "stone") // This returns nil.
再次,如果我将它们作为文件添加到项目中并通过此方法访问它们,我创建的一切都很好(或使用像SDWebImage这样的库),但我相信我正在失去应用程序稀疏的能力,因为图像作为文件托管所以,例如当需要2倍时,iPhone 7将具有2倍和3倍分辨率.
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,nil) else { return nil } self.init(cgImage: image) } }
所以我的问题是,任何人都可以向我解释使用HEIC作为图像资源文件夹中托管的图像的过程,并使其与app thinning兼容(只需获取所需的资源,即2x,3x)?
更新:
在研究了更多之后,当我在图像视图上设置图像名称时,我意识到图像是从IB加载的.你知道这是如何在内部工作的吗?使用哪个构造函数将UIImage设置为UIImageView?
更新2:
我已向Apple提交了雷达:
Radar
Apple的资产编译器重新编码以各种内部格式(一些是标准格式和一些专有格式)进入它的所有图像,具体取决于一系列因素,包括图像类型,目标操作系统版本以及可能的其他因素.不幸的是,在撰写本文时,就HEIC文件而言,资产编译器似乎是错误的;如果我尝试将HEIC文件放入资产目录中,它似乎被省略了.图像数据不会复制到Assets.car文件中,该文件本身大小只有16 KB,只包含几个空B树.因此,当您尝试使用UIImage加载图像时,您什么也得不到.
幸运的是,由于资产编译器无论如何都会重新编码输入的所有图像,您只需将图像重新编码为另一种格式(我建议使用PNG,因为它是无损的),最终用户收到的结果文件应该与它与HEIF输入文件一样(具有讽刺意味的是,它可能最终被编码为HEIF,因为资产格式支持它).所以,在Apple修复资产编译器中的这个错误之前,我会这样做.