【问题标题】:macOS Swift CALayer.contents does not load imagemacOS Swift CALayer.contents 不加载图像
【发布时间】:2018-12-21 04:41:32
【问题描述】:

下面的代码创建了一个红色矩形,动画可以从左到右在视图中移动。我想从图像中加载任意形状以叠加或替换矩形。但是,initializeCircleLayer 函数中的 circleLayer.contents = NSImage 语句不会产生任何效果。诊断打印语句似乎验证图像存在并且已被找到,但视图中没有图像出现。如何将图像放入图层以替换动画红色矩形?谢谢!

代码如下:

进口可可

类视图控制器:NSViewController {

   var circleLayer = CALayer()

   override func viewDidLoad() {

       super.viewDidLoad()
       self.view.wantsLayer = true
       initializeCircleLayer()
       simpleCAAnimationDemo()
   }

   func initializeCircleLayer(){

       circleLayer.bounds = CGRect(x: 0, y: 0, width: 150, height: 150)
       circleLayer.position = CGPoint(x: 50, y: 150)
       circleLayer.backgroundColor = NSColor.red.cgColor
       circleLayer.cornerRadius = 10.0

       let testIm = NSImage(named: NSImage.Name(rawValue: "testImage"))
       print("testIm = \(String(describing: testIm))")

       circleLayer.contents = NSImage(named: NSImage.Name(rawValue:  "testImage"))?.cgImage
       circleLayer.contentsGravity = kCAGravityCenter

       self.view.layer?.addSublayer(circleLayer)
   }

   func simpleCAAnimationDemo(){

       circleLayer.removeAllAnimations()
       let animation = CABasicAnimation(keyPath: "position")
       let startingPoint = NSValue(point: NSPoint(x: 50, y: 150))
       let endingPoint = NSValue(point: NSPoint(x: 600, y: 150))
       animation.fromValue = startingPoint
       animation.toValue = endingPoint
       animation.repeatCount = Float.greatestFiniteMagnitude
       animation.duration = 10.0
       circleLayer.add(animation, forKey: "linearMovement")
   }

}

【问题讨论】:

    标签: macos cocoa core-animation calayer nsimage


    【解决方案1】:

    为什么它不起作用

    原因

    circleLayer.contents = NSImage(named: NSImage.Name(rawValue:  "testImage"))?.cgImage
    

    不起作用是因为它是对cgImage(forProposedRect:context:hints:)方法的引用,这意味着它的类型是

    ((UnsafeMutablePointer<NSRect>?, NSGraphicsContext?, [NSImageRep.HintKey : Any]?) -> CGImage?)? 
    

    您可以通过将NSImage(named: NSImage.Name(rawValue: "testImage"))?.cgImage 分配给一个局部变量并-单击它来查看它的类型来查看它。

    编译器允许这个赋值,因为circleLayer.contents 是一个Any? 属性,所以实际上任何东西都可以赋值给它。

    如何解决

    从 macOS 10.6 开始,您可以将 NSImage 对象直接分配给层 contents

    circleLayer.contents = NSImage(named: NSImage.Name(rawValue:  "testImage"))
    

    【讨论】:

    • 是的,就是这样。
    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多