【问题标题】:SKShapeNode.fillColor not equal to original UIColorSKShapeNode.fillColor 不等于原始 UIColor
【发布时间】:2018-10-06 19:19:56
【问题描述】:

我刚刚浪费了很多时间来寻找为什么下面的代码给出的结果不相等的答案:

let originalColor = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)
let section = SKShapeNode(path: path.cgPath)
section.fillColor = originalColor
let isEqual = section.fillColor == originalColor //=> gives false

我不知道,这有什么问题。我比较了色彩空间和UIColor 对应的CGColor,只有CGColor 有不同的hashValue。但这是为什么呢?上面的代码应该可以工作,它非常简单,我在这里缺少什么?

编辑 我用下面的代码来比较UIColors:

extension SKColor {

static func !=(lhs: UIColor, rhs: UIColor) -> Bool {
    return !lhs.isEqualTo(rhs)
}

func isEqualTo(_ color: UIColor) -> Bool {
    var red1: CGFloat = 0, green1: CGFloat = 0, blue1: CGFloat = 0, alpha1: CGFloat = 0
    getRed(&red1, green:&green1, blue:&blue1, alpha:&alpha1)

    var red2: CGFloat = 0, green2: CGFloat = 0, blue2: CGFloat = 0, alpha2: CGFloat = 0
    color.getRed(&red2, green:&green2, blue:&blue2, alpha:&alpha2)

    return red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2
}

}

其他一些UIColor 的比较结果 - 以相同的方式实例化(后缀为 1 的红色/绿色/蓝色是形状的 fillColor

(lldb) po red1
0.8784313797950745

(lldb) po red2
0.8784313725490196

(lldb) po green1
0.10196078568696976

(lldb) po green2
 0.10196078431372549

(lldb) po blue1
0.30980393290519714

(lldb) po blue2
0.30980392156862746

【问题讨论】:

  • 您对 UIColor 相等性的工作方式做出了相当大的假设。这是一个想法:尝试显式地获取和测试颜色的redgreenbluealpha 组件。这样我们比较的是 CGFloats,我们知道它是如何工作的。
  • 哦哦哦还有一点要考虑:也许你给的颜色在幕后被简化为灰色?
  • 嘿@matt 感谢您的快速回复:) 我也用上面的代码检查了这一点 - 编辑了我的问题,请看一下。它根据CGFloat 组件给出不同的值。
  • 好的,但是现在你面临浮点比较的问题。这些颜色值与 7 或 8 位有效数字相同,这远远超出了任何可感知差异的范围。所以颜色等于所有意图和目的。

标签: ios swift sprite-kit uicolor skshapenode


【解决方案1】:

尝试改变这个:

return red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2

到这里:

return Float(red1) == Float(red2) && 
    Float(green1) == Float(green2) && 
    Float(blue1) == Float(blue2) && 
    Float(alpha1) == Float(alpha2)

【讨论】:

  • 这行得通! :) 非常感谢你。然而,在我看来,这似乎是 iOS 框架甚至 Swift 中的一个问题——我们看不到 Apple 框架的内部结构,很难验证。对于相同的比较技术和相同的输入,上述结果是不同的。很好地抓住@matt 来尝试降低浮点精度。现在结果是一样的:-)
  • 我已经尝试过比较 UIColors 实例化,但没有分配给 SKShapeNode.fillColor 并且它有效(在更改代码的比较部分之前。):)
  • 我仍然想知道,为什么fillColor 实例的fillColor 属性会发生这种情况。?
  • 好问题。 :) 但我认为我们都有相同的猜测:在幕后,也许颜色实际上正在减少到它的 Float 等价物。 — 此外,即使 UIColor 和 SKColor 是彼此的类型别名,将颜色创建为 SKColor 而不是 UIColor 会有所不同吗?
  • 是的,我知道 SKColor 的别名,但只是为了确保我已经尝试过 UIColor 和 SKColor - 同样的事情。我想也许在幕后有一个类名检查,但显然不是这样。
猜你喜欢
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2014-08-10
  • 2012-02-17
相关资源
最近更新 更多