要将梯度应用于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)}) )
那么,如何将许多自定义colors+locations发送到上面的类(或者希望是一个更好的建议)来创建自定义梯度(然后在我的NSView上绘制该梯度)?
发布于 2020-08-26 16:35:21
使用matt的线索,我替换了let行(使用更合适的API init(colors:atLocations:colorSpace:)):
let bgGradient = NSGradient(colorsAndLocations: (startColor, startPosition), (endColor, endPosition))使用
let bgGradient = NSGradient(colors: colorStopArray.map { $0.color }, atLocations: colorStopArray.map { $0.stop }, colorSpace: NSColorSpace.genericRGB)现在它起着我想要的作用。
发布于 2020-08-26 16:11:29
使用上述方法的
,我仅限于定义两个方法( startColor & startPosition和endColor & endPosition)。
不,你不是。这是一个变量;您可以添加任意数量的元组。这样做很好:
let startColor = NSColor.red
let startPosition: CGFloat = 0
let middleColor = NSColor.blue
let middlePosition: CGFloat = 0.5
var endColor = NSColor.white
var endPosition: CGFloat = 1
let bgGradient = NSGradient(colorsAndLocations:
(startColor, startPosition),
(middleColor, middlePosition),
(endColor, endPosition))如果问题是“我能把数组转换成变量吗?”,那么答案是,不幸的是,不行。这个特性(“飞溅”)在Swift语言中缺失了。在斯威夫特中,唯一的称呼变量的方法是变种。
允许您提供颜色和停止位置数组的初始化器是init(colors:atLocations:colorSpace:)。所以,如果这是你想要提供的,那就叫它初始化器。
https://stackoverflow.com/questions/63601329
复制相似问题