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
传递给您的原因。为此实施 CALayerDelegate
的 drawLayer:inContext:
。 updateLayer
是将位图直接分配给图层的另一种方法,但仅限于此。
这是 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() 函数快得多。
在 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
传递给您的原因。为此实施 CALayerDelegate
的 drawLayer:inContext:
。 updateLayer
是将位图直接分配给图层的另一种方法,但仅限于此。
这是 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() 函数快得多。