updateLayer() 上下文

updateLayer() context

在 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()
    }
}

因此,没有像 override func draw(_ dirtyRect: NSRect) 中那样有效的图形上下文,而且我似乎无法获得一个。我应该如何获得用于在 updateLayer 中绘图的有效图形上下文?

您不应该在 updateLayer 中绘图,这就是为什么没有 cgContext 传递给您的原因。为此实施 CALayerDelegatedrawLayer:inContext:updateLayer 是将位图直接分配给图层的另一种方法,但仅限于此。

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

这是 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() 函数快得多。