Question

J'ai un code que je ne peux pas comprendre pourquoi cela ne fonctionne pas,

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

J'ai aussi trouvé des gens qui font une substitution de la méthode isEqual, isEqualtoColor: Mais cela n'a pas non plus et je nourris que l'on lastColor.CGColor;

Partout où j'ai lu que isEqual est tout ce que vous devez comparer les UIColors, im actuellement recours à un tableau de chaînes pour le rouge, vert et bleu et en comparant la valeur flottante aux CGColorGetComponents (lastColor);

Mais cela ne fonctionne pas non plus.

Était-ce utile?

La solution

gist.github.com/mtabini/716917

Le lien ci-dessus fonctionne comme un charme. Merci terriblement « Nombre Chocula » à la fois une délicieuse source de réponses au chocolat et iphone: P

je cliquerais répondu à votre poste, mais il serait plus de misslead likly des gens qui se demandent ici.

Doit avoir juste été une tolérance à flotteur.

Autres conseils

Voici une version rapide de la réponse acceptée. Je l'ai laissé tomber la comparaison de CGColorSpaceRef que je ne pouvais pas trouver un moyen simple de faire cela dans rapide, mais il ne semble pas influer sur les résultats autres que en termes de performance.

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 vous saisissant la couleur de pixel d'un CGContext avec un espace de couleur RVB, il peut ne pas correspondre à celui utilisé par la classe UIColor. Les valeurs de pixels dans des références de mémoire directe dans un CGContext vont être 0-255 (dans un RGB). En fonction de la palette de couleurs que vous souhaitez comparer, je voudrais aborder probablement cela en utilisant des valeurs uint8_t à flotteur et éviter effectuer des comparaisons généralisées fondées sur les valeurs dominantes en RGB

Êtes-vous réellement la variable d'initialisation rouge? Cela devrait fonctionner:

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

-[UIColor isEqual:] est intégré de manière à comparer les couleurs. Cependant, vous devez vous rappeler que, bien que deux couleurs peuvent apparaître même à vos yeux sur un appareil particulier, ils peuvent différer mathématiquement et ainsi comparer l'inégalité. Deux couleurs qui apparaissent différentes à vos yeux (par exemple, « rouge pur » en RGB vs « rouge pur » en CMJN) peuvent, lors de la conversion à un espace de couleur neutre pour la comparaison, comparer l'égalité.

espaces couleurs sont b_ _ comme ça. :)

Si vous nous dites pourquoi vous voulez comparer deux couleurs, nous pouvons éventuellement vous fournir une meilleure solution que la comparaison directe.

En réponse à votre commentaire: Ne pas la base de votre interface utilisateur a frappé le test sur la couleur des pixels individuels ou même plusieurs. Leurs valeurs absolues peuvent changer en fonction de l'espace couleur de l'appareil, ce qui conduit à des faux positifs et négatifs. Au contraire, vous pouvez définir des régions « hotspot » en plaçant des objets invisibles UIButton dans votre interface, ou mieux encore, en utilisant quelque chose de plus souple comme CGPath et tester si une touche tombe dans ses limites. Quelque chose comme le travail de puissance suivant:

@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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top