我正在构建一些代码,我希望能够交叉编译。
目标是显示一个图像,拉伸它,以适应整个视图。下面是我调用的函数,在扩展UIView (in iOS)或NSView (in 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中它只是空的,我不知道为什么。
发布于 2018-03-27 18:45:18
在CABasicAnimation.中,我通过使用iOS实现了您想要做的事情您可以在下面看到我的自定义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")
}
}
https://stackoverflow.com/questions/49461831
复制相似问题