【问题标题】:overriding UIImage(named: )覆盖 UIImage(命名:)
【发布时间】:2015-11-23 22:11:54
【问题描述】:

我正在重写 UIImage 类方法 init(named:)。我的目标是能够检索图像的文件名。

代码如下所示:

class UIImageWithFileName: UIImage {

    let fileName: String

    override init(named:String){
        super.init(named)
    fileName = named
    }
}

由于以下原因,此代码似乎不可能。

我创建了一个 UIImage 的子类,开始输入 init... 令我惊讶的是,没有可覆盖的 init(named:) 方法。下面是完整的 init 方法列表:

如何覆盖 UIImage init(named:)

【问题讨论】:

    标签: ios uiimage initialization overriding subclassing


    【解决方案1】:

    原来“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?)
    

    这意味着您需要自己解析或打开文件并将原始数据传递给超类。

    【讨论】:

    • 从文件中打开图片时如何使用 Assets Catalog?
    • 还有更多信息in this related question。 “named”方法是 Objective-C 中的工厂方法,所以我猜想这些在 swift 中对应的 init 方法是为了方便。
    • 要在资产目录中找到适当的路径,您也许可以使用答案之一in this related question
    • 想出了一个解决方案。顶一下,让我知道你的想法
    【解决方案2】:

    这是一种解决方法:

    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
    }
    

    }

    不确定它是否有效或有任何争议。请反馈

    【讨论】:

      【解决方案3】:

      我发现这很好用。

      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)
          }
      
      }
      

      【讨论】:

      • 这可能很不安全。甚至不考虑图像方向。
      • 这行不通,它没有考虑到比例、方向和其他正常情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2010-11-14
      相关资源
      最近更新 更多