CGColorGetComponents()不返回黑色和白色的正确值

有没有人遇到过这个问题? 这看起来像苹果的代码中的错误,如果人们同意这个代码应该做我认为应该做的事情,我会提交一个雷达。 我并不是那么熟悉CoreGraphics色彩pipe理,因此我在问一个bug报告给苹果之前就问过了。

这是一个模板项目直接出来,唯一的非模板代码是你在下面看到的。 请注意,红色,绿色和蓝色都显示正确的组件值,但不是白色或黑色。

如果先改变顺序,比如先黑白再红,绿,蓝,问题依然存在。

这是Swift 1.2和Xcode 6.3.1(6D1002)。

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let colorComps = [ CGColorGetComponents(UIColor.redColor().CGColor), CGColorGetComponents(UIColor.greenColor().CGColor), CGColorGetComponents(UIColor.blueColor().CGColor), CGColorGetComponents(UIColor.blackColor().CGColor), CGColorGetComponents(UIColor.whiteColor().CGColor) ] var components = [CGFloat]() for cc in colorComps { for i in 0...3 { components.append(cc[i]) } } println("components: \(components)") } } 

你没有理解的是CGColorGetComponents没有任何声明或保证有多less组件或它们的意思。 信息包含在颜色的颜色空间中。 如果你看白色和黑色的颜色空间,你会看到他们都是灰色的forms:

 let sp = CGColorGetColorSpace(UIColor.whiteColor().CGColor) println(sp) // kCGColorSpaceDeviceGrey 

因此,它们只expression了两个值:灰色的数量和阿尔法。

因此,白色是[1.0,1.0] – 如果你忽略了一开始就不应该读的额外的两个数字,那就是你所得到的。

同样,黑色是[0.0,1.0] ,这也是你得到的。