首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NSGradient(colorsAndLocations:)中存储元组

如何在NSGradient(colorsAndLocations:)中存储元组
EN

Stack Overflow用户
提问于 2020-08-26 15:56:16
回答 2查看 110关注 0票数 0

要将梯度应用于NSView,最好是创建一个继承自NSView的类,并重写设置路径和绘制梯度的绘图方法。

代码语言:javascript
复制
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上绘制该梯度)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-26 16:35:21

使用matt的线索,我替换了let行(使用更合适的API init(colors:atLocations:colorSpace:)):

代码语言:javascript
复制
let bgGradient = NSGradient(colorsAndLocations: (startColor, startPosition), (endColor, endPosition))

使用

代码语言:javascript
复制
let bgGradient = NSGradient(colors: colorStopArray.map { $0.color }, atLocations: colorStopArray.map { $0.stop }, colorSpace: NSColorSpace.genericRGB)

现在它起着我想要的作用。

票数 0
EN

Stack Overflow用户

发布于 2020-08-26 16:11:29

使用上述方法的

,我仅限于定义两个方法( startColor & startPosition和endColor & endPosition)。

不,你不是。这是一个变量;您可以添加任意数量的元组。这样做很好:

代码语言:javascript
复制
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:)。所以,如果这是你想要提供的,那就叫它初始化器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63601329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档