简体   繁体   English

CALayer在iOS中不显示图像

[英]CALayer not showing image in iOS

I am building some code that I am hoping will be cross compilable. 我正在构建一些我希望可以交叉编译的代码。

The goal is to display an image stretching it to fit the entire view. 目的是显示图像以将其拉伸以适合整个视图。 Here is the function I am calling to attempt this inside of a class that extends UIView ( in iOS ) or NSView ( in macOS ): 这是我要在扩展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)
        }
    }

This code works perfectly on OSX however in iOS it is simply blank and I have no pointers as to why. 这段代码可以在OSX上完美地工作,但是在iOS中,它只是空白,我没有任何指示。

In iOS I have achieved what you were trying to do by using CABasicAnimation . 在iOS中,我已经通过使用CABasicAnimation实现了您要尝试的操作。 You can see my custom UIView class implementation below: 您可以在下面看到我的自定义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")
    }
}

I have tested this code in OSX app. 我已经在OSX应用程序中测试了此代码。 your cross compatibility concept is acquired by using this custom view. 您的交叉兼容性概念是通过使用此自定义视图获得的。 Below is my OSX custom view code: 以下是我的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")
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM