dir*_*nee 9 uiimage ios swift3 xcode8
我目前正在更新要使用的项目image literals,以享受非可选图像的好处.该项目正在导入各种框架,框架包含图像.
在框架中,我们必须声明一个扩展UIImage来覆盖初始化,因为它正在寻找错误包中的图像.我们做了类似的事情:
extension UIImage {
convenience init?(framework_named imageName: String) {
let bundle = Bundle(for: ClassNameInFramework.self)
self.init(named: imageName, in: bundle, compatibleWith: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
我也想在框架中使用图像文字,但像以前一样,文字正在为图像寻找错误的包并且应用程序崩溃.
有谁知道,如何指定要查找图像的包的图像文字?
die*_*yas 20
我发现了一个非常简单的解决方法,并且惊讶于在其他帖子上找不到它.我希望它可以更优雅,但它比UIImage(named:in:compatibleWith:)我认为使用串式初始化器更可取.
我们基本上利用了_ExpressibleByImageLiteral协议,Xcode使用该协议来确定类型是否可由图像文字表达.它是Swift标准库的一部分,但它隐藏在自动完成之外,我想因为想要用图像文字初始化自定义类型并不常见.但是,它正是我们想要的,并且行为与其他ExpressibleBy协议完全一样.
struct WrappedBundleImage: _ExpressibleByImageLiteral {
let image: UIImage?
init(imageLiteralResourceName name: String) {
let bundle = Bundle(for: ClassInFramework.self)
image = UIImage(named: name, in: bundle, compatibleWith: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用包装器而不是UIImage子类,这似乎是一个更好的选择.可悲的是,类似UIImage的课程并不打算被分类,如果你这样做,你会发现自己会遇到很多麻烦.
现在它的用法变成了:
let image = ( as WrappedBundleImage).image
Run Code Online (Sandbox Code Playgroud)
不像普通的图像文字那么简洁,但它是我们现在所拥有的最好的.我们只需要记住进行as转换,否则我们的自定义初始化程序将不会被调用.
你也可以这样做:
extension UIImage {
static func fromWrappedBundleImage(_ wrappedImage: WrappedBundleImage) -> UIImage? {
return wrappedImage.image
}
}
Run Code Online (Sandbox Code Playgroud)
我们现在可以像这样使用它:
UIImage.fromWrappedBundleImage()
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |