【问题标题】:How can I create a NSGradient from an array of colors and floats?如何从一组颜色和浮点数创建 NSGradient?
【发布时间】:2016-08-03 16:48:28
【问题描述】:

我有一个NSColors 数组和一个CGFloats 数组,表示渐变停止。我不知道如何使用这些数组来初始化NSGradient

我尝试将它们制成(NSColor, CGFloat)s 的数组,但NSGradient(colorsAndLocations: 不会接受它,因为它需要可变参数:

NSGradient(colors:, atLocations:, colorSpace:) 需要UnsafePointer,我不知道如何在 Swift 中正确处理,如果有的话。

【问题讨论】:

    标签: swift tuples variadic-functions objective-c-swift-bridge nsgradient


    【解决方案1】:

    我假设你知道这种用法:

    let cAndL: [(NSColor, CGFloat)] = [(NSColor.redColor(), 0.0), (NSColor.greenColor(), 1.0)]
    let gradient = NSGradient(colorsAndLocations: cAndL[0], cAndL[1])
    

    不幸的是,Swift 没有为我们提供将数组赋予可变参数函数的方法。


    还有第二部分。如果某些 API 将 UnsafePointer<T> 声明为数组,您可以创建一个 T 的 Swift Array,并将其直接传递给 API。

    let colors = [NSColor.redColor(), NSColor.greenColor()]
    let locations: [CGFloat] = [0.0, 1.0]
    let gradient2 = NSGradient(colors: colors, atLocations: locations, colorSpace: NSColorSpace.genericRGBColorSpace())
    

    如果你想使用(NSColorCGFloat)的Array,你可以这样写:

    let gradient3 = NSGradient(colors: cAndL.map{$0.0}, atLocations: cAndL.map{$0.1}, colorSpace: NSColorSpace.genericRGBColorSpace()) 
    

    【讨论】:

    • "你可以创建一个 T 的 Swift Array,并直接将它传递给 API" 这样能保证安全吗?
    • @BenLeggiero,当然。请参阅this document 的常量指针部分。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 2014-02-01
    • 2018-02-10
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2019-04-16
    • 2017-04-04
    相关资源
    最近更新 更多