Ios SKShapeNode.fillColor不等于原始UIColor
我已经浪费了很多时间寻找答案,为什么下面的代码给出的结果不一样:Ios SKShapeNode.fillColor不等于原始UIColor,ios,swift,sprite-kit,uicolor,skshapenode,Ios,Swift,Sprite Kit,Uicolor,Skshapenode,我已经浪费了很多时间寻找答案,为什么下面的代码给出的结果不一样: 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 fa
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
。但为什么呢?上面的代码应该是有效的,它非常简单,我在这里遗漏了什么
编辑
我使用了以下代码来比较UIColor
s:
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
尝试更改此选项:
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)
你对UIColor相等的工作原理做了一个很大的假设。这里有一个想法:尝试获取并显式测试颜色的
红色
、绿色
、蓝色
、和阿尔法
组件。这样我们比较的是CGfloat,我们知道它是如何工作的。哦哦,还有一点需要考虑:也许你给的颜色在幕后会变成灰色?嘿@matt谢谢你的快速回复:)我已经用上面的代码检查过了-编辑了我的问题,请看一下。它根据CGFloat
组件给出不同的值。好的,但是现在您面临浮点比较的问题。这些颜色值与7或8个有效数字相同,这远远超出了任何可感知差异的范围。因此,颜色与所有意图和目的相同。这是有效的!:)非常感谢你。然而,在我看来,这似乎是iOS框架甚至Swift中的一个问题——我们看不到苹果框架的内部结构,很难验证。对于相同的比较技术和相同的输入,上述结果是不同的。良好的捕捉@matt,以降低浮动精度。现在结果是一样的:-)我已经尝试过同样的方法来比较实例化的UIColor
s,但没有分配给SKShapeNode.fillColor
,并且成功了(在对代码的比较部分进行更改之前):)我仍然想知道,为什么这会发生在SKShapeNode
实例的fillColor
属性上。好问题:但我认为我们都有相同的猜测:在幕后,也许颜色实际上是减少到它的浮动当量。-此外,即使UIColor和SKColor是彼此的类型别名,将您的颜色创建为SKColor而不是UIColor会有不同吗?是的,我知道SKColor的别名,但只是为了确保我尝试过UIColor和SKColor-同样的事情。我想,也许在幕后,有一个类名检查,但显然不是这样。