【问题标题】:CALayer not showing image in iOSCALayer没有在iOS中显示图像
【发布时间】:2018-03-24 06:10:48
【问题描述】:

我正在构建一些我希望可以交叉编译的代码。

目标是显示拉伸图像以适应整个视图。这是我在扩展 UIView(在 iOS)或 NSView(在 macOS)的类中调用的函数:

var viewLayer:CALayer?


 func updateViewer() {
        if let curr = viewLayer {
            curr.removeFromSuperlayer()
        }
        viewLayer = CALayer()
        viewLayer?.frame = Rect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
        viewLayer?.contentsGravity = kCAGravityResizeAspectFill
        viewLayer?.contents = //A UIImage
        //This may look weird but its a good way to get it to work on UIView and NSView
        if let laya = (layer as Any) as? CALayer {
            laya.frame = Rect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
            laya.insertSublayer(viewLayer!, at: 0)
        }
    }

此代码在 OSX 上完美运行,但在 iOS 中它只是空白,我不知道为什么。

【问题讨论】:

    标签: ios uikit core-graphics core-animation


    【解决方案1】:

    在 iOS 中,我通过使用 CABasicAnimation 实现了您想要做的事情。您可以在下面看到我的自定义 UIView 类实现:

    class MyCustomView: UIView {
       var viewLayer:CALayer?
    
       override init(frame: CGRect) {
          super.init(frame: frame)
    
          updateViewer()
       }
    
       required init?(coder aDecoder: NSCoder) {
          fatalError("init(coder:) has not been implemented")
       }
    
       func updateViewer() {
    
          if let curr = viewLayer {
            curr.removeFromSuperlayer()
          }
          viewLayer = CALayer()
          viewLayer?.frame = self.bounds
          viewLayer?.contentsGravity = kCAGravityResize // you were using kCAGravityResizeAspectFill
          viewLayer?.contents = UIImage(named: "bg-3.png")?.cgImage
          layer.addSublayer(viewLayer!)
    
          let basic = CABasicAnimation(keyPath: "transform")
          basic.fromValue = NSValue(caTransform3D: CATransform3DMakeScale(0.1, 0.1, 0.1))
          basic.toValue = NSValue(caTransform3D: CATransform3DMakeScale(1.0, 1.0, 0.1))
          basic.duration = 2.0
          viewLayer?.add(basic, forKey: "transform")
        }
    }
    

    我已经在 OSX 应用程序中测试了这段代码。您的交叉兼容性概念是通过使用此自定义视图获得的。下面是我的 OSX 自定义视图代码:

    class MyCustomView: NSView {
    var viewLayer:CALayer?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.wantsLayer = true
        updateViewer()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func updateViewer() {
    
        if let curr = viewLayer {
            curr.removeFromSuperlayer()
        }
        viewLayer = CALayer()
        viewLayer?.frame = self.bounds
        viewLayer?.contentsGravity = kCAGravityResize
        viewLayer?.contents = NSImage(imageLiteralResourceName: "bg-3.png")
        layer?.addSublayer(viewLayer!)
    
        let basic = CABasicAnimation(keyPath: "transform")
        basic.fromValue = NSValue(caTransform3D: CATransform3DMakeScale(0.1, 0.1, 0.1))
        basic.toValue = NSValue(caTransform3D: CATransform3DMakeScale(1.0, 1.0, 0.1))
        basic.duration = 2.0
        viewLayer?.add(basic, forKey: "transform")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多