覆盖 UIImage(命名为:)
overriding UIImage(named: )
我正在重写 UIImage class 方法 init(named:)
。我的目标是能够检索图像的文件名。
代码如下所示:
class UIImageWithFileName: UIImage {
let fileName: String
override init(named:String){
super.init(named)
fileName = named
}
}
由于以下原因,此代码似乎是不可能的。
我创建了一个 UIImage 的子class,开始输入 init... 令我惊讶的是没有 init(named:) 方法可以覆盖。以下是 init 方法的完整列表:
如何覆盖 UIImage init(named:)
原来“init(named:
”是明确不可继承的。
如果您查看 UIImage 定义,您会看到:
public class UIImage : NSObject, NSSecureCoding, NSCoding {
public /*not inherited*/ init?(named name: String) // load from main bundle
@available(iOS 8.0, *)
public /*not inherited*/ init?(named name: String, inBundle bundle: NSBundle?, compatibleWithTraitCollection traitCollection: UITraitCollection?)
也就是说需要自己解析或者打开文件,将原始数据传入super class.
这是一种解决方法:
class UIImageWithName: UIImage {
var fileName: String!
func ofFile(named:String) -> UIImageWithName?{
let cgImage = UIImage(named: named)?.CGImage
if let validName = cgImage{
let image = UIImageWithName(CGImage: validName)
image.fileName = named
return image
}
return nil
}
}
不确定它是否有效或有任何争议。请反馈
我发现这个很好用。
class MyImage: UIImage {
convenience init?(named name: String) {
guard let image = UIImage(named: name),
let cgImage = image.cgImage else {
return nil
}
self.init(cgImage: cgImage)
}
}
我正在重写 UIImage class 方法 init(named:)
。我的目标是能够检索图像的文件名。
代码如下所示:
class UIImageWithFileName: UIImage {
let fileName: String
override init(named:String){
super.init(named)
fileName = named
}
}
由于以下原因,此代码似乎是不可能的。
我创建了一个 UIImage 的子class,开始输入 init... 令我惊讶的是没有 init(named:) 方法可以覆盖。以下是 init 方法的完整列表:
如何覆盖 UIImage init(named:)
原来“init(named:
”是明确不可继承的。
如果您查看 UIImage 定义,您会看到:
public class UIImage : NSObject, NSSecureCoding, NSCoding {
public /*not inherited*/ init?(named name: String) // load from main bundle
@available(iOS 8.0, *)
public /*not inherited*/ init?(named name: String, inBundle bundle: NSBundle?, compatibleWithTraitCollection traitCollection: UITraitCollection?)
也就是说需要自己解析或者打开文件,将原始数据传入super class.
这是一种解决方法:
class UIImageWithName: UIImage {
var fileName: String!
func ofFile(named:String) -> UIImageWithName?{
let cgImage = UIImage(named: named)?.CGImage
if let validName = cgImage{
let image = UIImageWithName(CGImage: validName)
image.fileName = named
return image
}
return nil
}
}
不确定它是否有效或有任何争议。请反馈
我发现这个很好用。
class MyImage: UIImage {
convenience init?(named name: String) {
guard let image = UIImage(named: name),
let cgImage = image.cgImage else {
return nil
}
self.init(cgImage: cgImage)
}
}