Swift 中 UIColor 作为函数参数的奇怪行为

Strange Behavior Of UIColor As Function Parameter In Swift

我创建了一个参数数量可变的函数。这是我的功能:

func setColors(colors: UIColor...) {
    self.Colors = colors
}

现在,当我向它传递一些值时:

setColors(UIColor.blackColor(), UIColor.redColor())

黑色在函数中会变成白色。这种情况只发生在黑色上,其他颜色都可以。

这个东西在class中用来生成渐变:

var Colors: [UIColor] = []

func setColors(colors: UIColor...) {
    self.Colors = colors
}

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()

    let colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()

    var colorComponent: [CGFloat] = []
    var colorLocations: [CGFloat] = []
    var i: CGFloat = 0.0;

    for color in Colors {
        let c = CGColorGetComponents(color.CGColor)
        colorComponent.append(c[0])
        colorComponent.append(c[1])
        colorComponent.append(c[2])
        colorComponent.append(c[3])
        colorLocations.append(i)
        i += CGFloat(1.0) / CGFloat(self.Colors.count)
    }

    let gradient: CGGradientRef = CGGradientCreateWithColorComponents(colorSpace, colorComponent, colorLocations, self.Colors.count)

    CGContextDrawLinearGradient(context, gradient, CGPoint(x: 0.0, y: self.frame.size.height / 2), CGPoint(x: self.frame.size.width, y: self.frame.size.height / 2), 0)
}

问题是你用的CGColorGetComponents错了:

let c = CGColorGetComponents(color.CGColor)
colorComponent.append(c[0])
colorComponent.append(c[1])
colorComponent.append(c[2])
colorComponent.append(c[3])

你在这里做出了错误的假设。

该代码恰好起作用如果该颜色在具有四个分量的 UIDeviceRGBColorSpace 中。

但是如果 UIDeviceWhiteColorSpace 中的这种颜色只有 两个 分量和黑色 ,它 不会 起作用在UIDeviceWhiteColorSpace中是

您可以尝试这样的操作:

var colors: [UIColor] = []

func setColors(colors: UIColor...) {
    self.colors = colors
}

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    let colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()

    var gradientColors: [CGColor] = []
    var colorLocations: [CGFloat] = []
    var i: CGFloat = 0.0;

    for color in colors {
        gradientColors.append(color.CGColor)
        colorLocations.append(i)
        i += CGFloat(1.0) / CGFloat(colors.count)
    }

    let gradient: CGGradientRef = CGGradientCreateWithColors(colorSpace, gradientColors, colorLocations)

    CGContextDrawLinearGradient(context, gradient, CGPoint(x: 0.0, y: self.frame.size.height / 2), CGPoint(x: self.frame.size.width, y: self.frame.size.height / 2), 0)
}

旁注:您不想将变量名大写。所以我将 self.Colors 更改为 self.colors