Чтобы применить градиент к NSView, лучше всего создать класс, наследуемый от NSView, и переопределить метод рисования, который задает путь и рисует градиент.
class GradientView: NSView {
var startColor = NSColor.red
var startPosition: CGFloat = 0
var endColor = NSColor.white
var endPosition: CGFloat = 1
var rotation: CGFloat = 0
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
let bgGradient = NSGradient(colorsAndLocations: (startColor, startPosition), (endColor, endPosition))
let path = NSBezierPath.init(rect: self.bounds)
bgGradient?.draw(in: path, angle: rotation)
}
}
(Дайте мне знать, если есть лучший/более простой способ...)
Это прекрасно работает, но теперь я хочу отправить собственную коллекцию цветов и цветовых остановок. Примечание. *С помощью этого вышеприведенного метода я ограничен определением только двух (startColor и startPosition и endColor и endPosition).
Я хотел бы использовать (массив?) кортежей (содержащих несколько цветов и их стоп-значения). API для установки цвета и местоположения — NSGradient(colorsAndLocations:)
и использует кортеж (NSColor, CGFloat)
.
Я могу добавить такой параметр, как var colorStopArray: [(color: NSColor, stop: CGFloat)] = []
, который создает массив (таких) кортежей. Также я могу добавлять значения с помощью: colorStopArray.append((startColor, startPosition)).
Но как я могу назначить это API?
Я пробовал много методов, и все они вызывают ошибки (например, пробовал NSGradient(colorsAndLocations: colorStopArray.flatMap{return ($0.color, $0.stop)})
)
Итак, как можно отправить много пользовательских цветов и местоположений в вышеуказанный класс (или, надеюсь, лучшее предложение) для создания пользовательского градиента (который затем будет отображаться в моем NSView)?
NSView
, не должны вызывать super дляdraw(_:)
. - person liquid   schedule 26.08.2020