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
我创建了一个参数数量可变的函数。这是我的功能:
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