强制自定义NSView从PaintCode到Redraw



我在PaintCode中创建了一个以编程方式绘制的图标(但这个问题不一定是该工具特有的(,我正在尝试重新绘制该图标。

我使用这样一个自定义类:

class IconTabGeneral: NSView {
override func draw(_ dirtyRect: NSRect) {
StyleKitMac.drawTabGeneral()
}
}

drawTabGeneral()StyleKitMac类中的一个方法(由PaintCode生成(,它看起来如下(我将省略所有bezierPath细节(:

@objc dynamic public class func drawTabGeneral(frame targetFrame: NSRect = NSRect(x: 0, y: 0, width: 22, height: 22), resizing: ResizingBehavior = .aspectFit) {
//// General Declarations
let context = NSGraphicsContext.current!.cgContext
//// Resize to Target Frame
NSGraphicsContext.saveGraphicsState()
let resizedFrame: NSRect = resizing.apply(rect: NSRect(x: 0, y: 0, width: 22, height: 22), target: targetFrame)
context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY)
context.scaleBy(x: resizedFrame.width / 22, y: resizedFrame.height / 22)
//// Bezier Drawing
let bezierPath = NSBezierPath()
...
bezierPath.close()
StyleKitMac.accentColor.setFill() ⬅️Custom color set here 
bezierPath.fill()
NSGraphicsContext.restoreGraphicsState()
}

其中定义的accentColor是一个可以由用户更改的设置。在用户更改新颜色后,我无法让IconTabGeneral的实例重新绘制以获取新颜色。

我尝试过,但没有任何运气:

iconGeneralTabInstance.needsDisplay = true

我的理解是needsDisplay会迫使draw函数再次启动,但显然不会。

你知道我如何让这个图标重新绘制并填充它的bezierPath吗?

使用NSImageView怎么样?下面是一个工作示例:

import AppKit
enum StyleKit {
static func drawIcon(frame: CGRect) {
let circle = NSBezierPath(ovalIn: frame.insetBy(dx: 1, dy: 1))
NSColor.controlAccentColor.setFill()
circle.fill()
}
}
let iconView = NSImageView()
iconView.image = .init(size: .init(width: 24, height: 24), flipped: true) { drawingRect in
StyleKit.drawIcon(frame: drawingRect)
return true
}
import PlaygroundSupport
PlaygroundPage.current.liveView = iconView

我想我明白了。原来PaintCode生成的StyleKitMac类正在缓存颜色。事实上,图标是在设置needsDisplay之后重新绘制的。所以我只需要刷新缓存的颜色值。

相关内容

  • 没有找到相关文章

最新更新