在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中进行绘制?
答案 0 :(得分:2)
您不应该使用updateLayer
,这就是为什么没有cgContext
传递给您的原因。为此实现CALayerDelegate
的{{1}}。 drawLayer:inContext:
是将位图直接分配给图层的另一种方法,并且仅限于此。
答案 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()函数快得多。