-[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