updateLayer()上下文

时间:2018-10-23 13:32:26

标签: swift macos core-graphics

在NSView中,针对macOS 10.14执行此操作:

override var wantsUpdateLayer: Bool {
    return true
}

override func updateLayer() {
    if let context = NSGraphicsContext.current?.cgContext {
        // Never enters here
    }
    else {
        // Gives run-time error, invalid context
        let path = NSBezierPath()
        path.move(to: NSPoint(x: 0, y: 0))
        path.line(to: NSPoint(x: 10, y: 10))
        path.stroke()
    }
}

因此,没有有效的图形上下文,因为在覆盖函数func draw(__ dirtyRect:NSRect)中,我似乎无法获得一个图形上下文。我应该如何获取一个有效的图形上下文以便在updateLayer中进行绘制?

2 个答案:

答案 0 :(得分:2)

您不应该使用updateLayer,这就是为什么没有cgContext传递给您的原因。为此实现CALayerDelegate的{​​{1}}。 drawLayer:inContext:是将位图直接分配给图层的另一种方法,并且仅限于此。

请参阅:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/SettingUpLayerObjects/SettingUpLayerObjects.html

答案 1 :(得分:0)

这是您针对Swift 5的解决方案:

override var wantsUpdateLayer: Bool
{ 
    return (true)
}

override func updateLayer ()
{
    let cgimage: CGImage? = picture // Here comes the picture
    if cgimage != nil
    {
        let nsimage: NSImage? = NSImage(cgImage: cgimage!, size: NSZeroSize)
        if nsimage != nil
        {
            let desiredScaleFactor: CGFloat? = self.window?.backingScaleFactor
            if desiredScaleFactor != nil
            {
                let actualScaleFactor: CGFloat? = nsimage!.recommendedLayerContentsScale(desiredScaleFactor!)
                if actualScaleFactor != nil
                {
                    self.layer!.contents      = nsimage!.layerContents(forContentsScale: actualScaleFactor!)
                    self.layer!.contentsScale = actualScaleFactor!
                }
            }
        
        }
    }
}

您将看到图片插入位置并在以后分配。希望能有所帮助。我有同样的问题。比draw()函数快得多。