4

我有一些代码我不知道为什么它不起作用,

UIColor *lastColor, *red;
red = [UIColor colorWithRed:0.993 green:0.34444 blue:0.0 alpha:1.0]; 

NSString *chosenColor;

if([lastColor isEqual: red])
{
   chosenColor = @"red";
}

我还发现有些人重写了 isEqual 方法 isEqualtoColor: 但这也不起作用,我喂了一个 lastColor.CGColor;

在我读到的所有地方,isEqual 都是您比较 UIColors 所需要的,我目前正在使用红色、绿色和蓝色的字符串数组,并将浮点值与 CGColorGetComponents(lastColor);

但这也不起作用。

4

5 回答 5

6

gist.github.com/mtabini/716917

上面的链接就像一个魅力。非常感谢“Count Chocula”巧克力的美味来源和 iPhone 答案:P

我会点击回答您的帖子,但它可能会误导任何想知道这里的人。

一定只是一个浮动公差。

于 2010-11-28T11:01:36.930 回答
2

这是已接受答案的 Swift 版本。我已经放弃了CGColorSpaceRef比较,因为我找不到直接的快速方法,但除了性能方面之外,它似乎不会影响结果。

class func colorsConsideredSimilar(color: UIColor, otherColor: UIColor) -> Bool {
    let tolerance: CGFloat = 0.05 // 5%

    let colorRef: CGColorRef = color.CGColor
    let otherColorRef: CGColorRef = otherColor.CGColor

    let componentCount = CGColorGetNumberOfComponents(colorRef)

    let components = CGColorGetComponents(colorRef)
    let otherComponents = CGColorGetComponents(otherColorRef)

    for var i = 0; i < componentCount; i++ {
        let difference = components[i] / otherComponents[i]

        if (fabs(difference - 1) > tolerance) {
            return false
        }
    }

    return true
}
于 2016-02-18T16:32:36.553 回答
1

如果您从具有 RGB 颜色空间的 CGContext 中获取像素颜色,则它可能与 UIColor 类使用的颜色不匹配。CGContext 中直接内存引用中的像素值将是 0-255(在 RGB 中)。根据您要比较的颜色调色板,我可能会使用 uint8_t 值来避免浮动并根据 RGB 中的主要值执行广义比较

于 2010-11-26T16:26:59.163 回答
0

您实际上是在初始化红色变量吗?这应该有效:

if ([lastColor isEqual:[UIColor redColor]]) {
  /* … */
}
于 2010-11-26T15:23:31.410 回答
0

-[UIColor isEqual:]是比较颜色的内置方法。但是,您必须记住,虽然在特定设备上两种颜色在您看来可能相同,但它们在数学上可能不同,因此比较不平等。在您的眼睛看来不同的两种颜色(例如,RGB 中的“纯红色”与 CMYK 中的“纯红色”)在转换为中性颜色空间进行比较后,可能会比较相等。

色彩空间就是这样的 b_ _。:)

如果您告诉我们为什么要比较两种颜色,我们可能会为您提供比直接比较更好的解决方案。

回应您的评论:不要将您的用户界面点击测试基于单个甚至多个像素的颜色。它们的绝对值会根据设备颜色空间而变化,从而导致误报和误报。相反,您可以通过在界面中放置不可见的UIButton对象来定义“热点”区域,或者更好的是,通过使用更灵活的东西CGPath并测试触摸是否在其范围内。像下面这样的东西可能会起作用:

@interface HotSpottyView : UIView {
    @private NSMutableDictionary *hotspots;
}
- (void)addHotspot: (CGPathRef)path withBlock: (void (^ handler)(void));
@end


@implementation HotSpottyView
- (id)initWithFrame: (CGRect)frameRect {
    self = [super initWithFrame: frameRect];

    if (self) {
        self->hotspots = [[NSMutableDictionary alloc] init];
    }

    return self;
}

- (id)initWithCoder: (NSCoder *)aDecoder {
    self = [super initWithFrame: frameRect];

    if (self) {
        self->hotspots = [[NSMutableDictionary alloc] init];
    }

    return self;
}

- (void)dealloc {
    [self->hotspots release];
    [super dealloc];
}

- (void)addHotspot: (CGPathRef)path withBlock: (void (^ handler)(void)) {
    CGPathRef immutablePath = CGPathCreateCopy(path);
    if (immutablePath) {
        [self->hotspots setObject: handler forKey: (id)immutablePath];
        CGPathRelease(immutablePath);
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *t = [touches anyObject];
    CGPoint loc = [t locationInView: self];
    if (CGRectContainsPoint(self.bounds, loc)) {
        for (id path in self->hotspots) {
            if (CGPathContainsPoint((CGPathRef)path, NULL, loc, FALSE)) {
                void (^ handler)(void) = [self->hotspots objectForKey: path];
                handler();
            }
        }
    }
}
@end
于 2010-11-26T15:26:53.037 回答