UIColor比较没有给出期望的结果

时间:2013-10-02 14:24:49

标签: objective-c uicolor textcolor

我正在尝试获取UITextView使用的颜色。

为此我写了,

myTextView.textColor

但是这给了我输出

UIDeviceRGBColorSpace 0.439216 0.439216 0.439216 1

知道如何获得实际的RGB组合吗?


我明白了......

我需要乘以255:D:P

当0.439216 * 255为112时为什么我的颜色比较没有给出理想的结果?

我应用于UITextView的颜色如下所示,使用常量。

#define placeColor [UIColor colorWithRed:112/255.0 green:112/255.0 blue:112/255.0 alpha:1.0]

当我比较时

if (aboutCompany.textColor == placeColor) {
    NSLog(@"place color..");
    aboutCompany.text = @"";
    aboutCompany.textColor = fottColor;
} else {
    NSLog(@"not place color..");
}

我得到了,而不是放置颜色......

有什么理由为什么?

1 个答案:

答案 0 :(得分:0)

当你比较两个NSObject(或NSObject子类,在本例中)时,你不想使用==运算符。 ==运算符不会告诉您这两个对象是否具有相同的值,它只会告诉您是否正在比较相同的对象。您需要使用'compare'或'isEqual'方法。 (比较有一些额外的开销,因为它实际上返回一个枚举,表示三种状态之一,分别对应于<,=和>)

'在幕后',发生的事情是在Objective-C中,你永远不会直接声明一个NSObject,你只需要声明一个指针,然后用对象填充的地址空间填充它。

{
    NSObject *foo=[[Foo alloc] init];
    NSObject *bar=foo;

    foo==bar;//true
    //If you inspect foo and bar really closely in the debugger, you'll discover they're both just integers pointing to a 'random' memory space.
}

{
    NSNumber *alpha=@(1);
    NSNumber *beta=@(1);
    //Again, if you inspect these very closely, you'll discover they're pointers to memory space, but this time you're pointing to two different spaces in memory, even though you're storing the same data in them.
    alpha==beta;//False, they're two separate objects
    [alpha isEqualTo:beta];//true; their value is identical
    [alpha intValue]==[beta intValue;//Again, true because their value is identical
}

另外,在使用浮点值时,我会非常小心地相信相等运算符的结果 - 而UIColor是基于浮点数构建的。浮游生物有一种不平等的习惯,即使他们应该这样做。它与数字的底层机器表示有关,数字中可能有一定程度的“噪音”。这种噪音在大多数时候都是相对微不足道的(例如+/- 1 * 10 ^ -10),但是当你想要进行平等操作时它会变得非常痛苦。网上有很多文章可以更好地覆盖这些文章,随意查看它们,但是你需要检查两个数字之间的差异是否小于给定的epsilon - 差异小于10例如^ -5。究竟如何得到一个合适的epsilon是我无法帮助你的,你需要做自己的研究。如果我可以帮助它,我只是从不使用浮点数来避免头痛,当然也从不做任何需要相等运算符的东西。