CGColorGetComponents()没有为黑色和白色返回正确的值

时间:2015-05-03 23:10:15

标签: ios swift quartz-graphics

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

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

如果您更改顺序,例如首先是黑色和白色,然后是红色,绿色,蓝色,则问题仍然存在。

这是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)")
    }
}

1 个答案:

答案 0 :(得分:4)

您没有理解的是,CGColorGetComponents没有任何关于有多少组件或它们意味着什么的声明或保证。 信息包含在颜色的颜色空间中。如果你看一下白色和黑色的颜色空间,你会发现它们都是灰色的形式:

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

因此,它们只用两个值表示:灰色量和alpha值。

因此,白色是[1.0,1.0] - 如果你忽略了你不应该首先阅读的额外两个数字,那就是你得到的。

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