Принудительно настраивать NSView из PaintCode для перерисовки - PullRequest
1 голос
/ 08 ноября 2019

Я создал значок в 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?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Я думаю, что понял. Оказывается, сгенерированный PaintCode класс StyleKitMac кэшировал цвет. На самом деле значок перерисовывался после установки needsDisplay. Поэтому мне просто пришлось обновить значение цвета в кеше.

1 голос
/ 08 ноября 2019

Как насчет использования 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
...