从PaintCode强制自定义NSView重新绘制

问题描述 投票:0回答:2

我在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吗?

swift nsview nsbezierpath setneedsdisplay paint-code
2个回答
1
投票

如何使用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

0
投票

我想我明白了。事实证明PaintCode生成的StyleKitMac类正在缓存颜色。实际上,该图标是在设置了needsDisplay之后重绘的。因此,我只需要刷新缓存的颜色值。

© www.soinside.com 2019 - 2024. All rights reserved.