[英]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.