Pregunta

Tengo algo de código que no puedo entender por qué no está funcionando,

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";
}

También he encontrado algunas personas que hacen una anulación del método IsEqual, isEqualtoColor: Pero esto no funcionó bien y me dio de comer a uno lastColor.CGColor;

En todas partes he leído que IsEqual es todo lo que necesita para comparar los UIColors, im actualmente recurrir a una matriz de cadenas para el rojo, verde y azul y comparando el valor en coma flotante a las CGColorGetComponents (lastColor);

Sin embargo, esto no está funcionando bien.

¿Fue útil?

Solución

gist.github.com/mtabini/716917

El enlace de arriba funciona como un encanto. Muchísimas gracias "Count Chocula" tanto una deliciosa fuente de chocolate y respuestas iphone: P

Me hacía clic respondió a su puesto, pero sería más que misslead likly cualquier gente preguntando aquí.

Debe haber sido sólo una tolerancia de flotación.

Otros consejos

Aquí hay una versión rápida de la respuesta aceptada. Se me ha caído la comparación CGColorSpaceRef ya que no podía encontrar una manera sencilla de hacerlo en veloz, pero no parece afectar a los resultados que no sean en términos de rendimiento.

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
}

Si usted está tomando el color del píxel de una CGContext con un espacio de color RGB, entonces puede no coincidir con el utilizado por la clase UIColor. Los valores de los píxeles en las referencias a memoria directa en un CGContext van a ser 0-255 (en un RGB). Dependiendo de la paleta de colores que desea comparar con, probablemente me acerco a este utilizando valores uint8_t al flotador evitar y realizar comparaciones generalizadas en base a los valores dominantes en RGB

¿En realidad inicializando la variable roja? Esto debería funcionar:

if ([lastColor isEqual:[UIColor redColor]]) {
  /* … */
}

-[UIColor isEqual:] es la incorporada en forma de comparar colores. Sin embargo, hay que recordar que, si bien dos colores pueden parecer lo mismo a los ojos en un dispositivo en particular, pueden diferir matemáticamente y así comparar desigual. Dos colores diferentes que aparecen a los ojos (por ejemplo, "rojo puro" en RGB frente a "rojo puro" en CMYK) pueden, tras la conversión en un espacio de color neutro para la comparación, comparar iguales.

espacios

color son una b_ _ de esa manera. :)

Si nos dice ¿Por qué que desea comparar dos colores, que posiblemente le puede proporcionar una solución mejor que la comparación directa.

En respuesta a tu comentario: No base su interfaz de usuario hit prueba en el color de los píxeles individuales o incluso múltiples. Sus valores absolutos pueden cambiar en función del espacio de color del dispositivo, dando lugar a falsos positivos y negativos. Más bien, se pueden definir regiones "punto caliente" mediante la colocación de objetos UIButton invisibles en su interfaz, o mejor aún, mediante el uso de algo más flexible como CGPath y probar si un contacto está dentro de sus límites. Algo así como los siguientes trabajos fuerza:

@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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top