Xcode8:在框架中使用图像文字



我目前正在更新一个项目以使用image literals,以享受非可选图像的好处。该项目正在导入各种框架,这些框架包含图像。

在框架中,我们必须在UIImage上声明一个扩展来覆盖初始化程序,因为它在错误的bundle中查找图像。我们做了一些类似的事情:

extension UIImage {   
convenience init?(framework_named imageName: String) {
let bundle = Bundle(for: ClassNameInFramework.self)
self.init(named: imageName, in: bundle, compatibleWith: nil)
}
}

我也想在框架中使用图像文字,但和以前一样,文字正在为图像寻找错误的捆绑包,应用程序崩溃

有人知道吗,如何指定要查找图像的捆绑包的图像文字?

我发现了一个非常简单的解决方法,很惊讶在其他帖子中找不到它。我希望它能更优雅,但在我看来,它比使用字符串类型的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)
}
}

请注意,我使用包装器而不是UIImage子类,这似乎是一个更好的选择。遗憾的是,像UIImage这样的类并不打算被子类化,如果你这样做,你会发现自己会遇到很多麻烦

现在它的用法变成:

let image = (🏞 as WrappedBundleImage).image

不像普通的图像文字那么简洁,但这是我们目前最好的。我们只需要记住执行as强制转换,否则我们的自定义初始值设定项将不会被调用。

你也可以这样做:

extension UIImage {
static func fromWrappedBundleImage(_ wrappedImage: WrappedBundleImage) -> UIImage? {
return wrappedImage.image
}
}

我们现在可以这样使用它:

UIImage.fromWrappedBundleImage(🏞)

希望这能有所帮助!

最新更新