ios - Come confrontare UIColors?



objective-c cocoa-touch (11)

Vorrei controllare il set di colori per uno sfondo su UIImageView. Ho provato:

if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}

ma questo non funziona, anche quando so che il colore è verde, cade sempre nella parte opposta.

Inoltre, c'è un modo per emettere il colore corrente nella console di debug.

p [myimage backgroundColor]

e

po [myimage backgroundColor]

non lavorare


Answer #1

Quando si confronta myimage.backgroundColor == [UIColor greenColor] questo modo se non si cambia il backgroundColor in verde prima che tale istruzione non funzioni.

Ho avuto lo stesso problema nel mio gioco a colori e ho risolto che usando l'equazione alle differenze semplice nei colori RGB puoi dare un'occhiata veloce a questo esempio di codice corto ColorProcess da here

è come la risposta dei vincitori

GFloat distance = sqrtf(powf((clr0.red - clr1.red), 2) + powf((clr0.green - clr1.green), 2) + powf((clr0.blue - clr1.blue), 2) );
if(distance<=minDistance){
....
}else{
…
}

Invece di quell'esempio di codice puoi usare

include "UIColorProcess.h"

..

float distance = [UIColorProcess findDistanceBetweenTwoColor:[UIColor redColor] secondColor:[UIColor blueColor]];

e ovviamente se restituisce 0 significa che stai confrontando il colore troppo simile. l'intervallo di ritorno è qualcosa come (0.0f - 1.5f) ..


Answer #2

Che dire:

+(BOOL)color:(UIColor *)color1 matchesColor:(UIColor *)color2
{
    CGFloat red1, red2, green1, green2, blue1, blue2, alpha1, alpha2;
    [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
    [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];

    return (red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2);
}

Answer #3

Ecco un'estensione per passare allo Spazio colore RGC in Swift:

extension UIColor {

func convertColorToRGBSpaceColor() -> UIColor {
    let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
    let oldComponents = CGColorGetComponents(self.CGColor)
    let components = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
    let colorRef = CGColorCreate(colorSpaceRGB, components)
    let convertedColor = UIColor(CGColor: colorRef!)
    return convertedColor
}

}


Answer #4

Estensione UIColor

- (CGFloat)accuracyCompareWith:(UIColor *)color {
    CIColor *c1 = [[CIColor alloc] initWithColor:self];
    CIColor *c2 = [[CIColor alloc] initWithColor:color];

    BOOL hasAlpha = c1.numberOfComponents == 4 && c2.numberOfComponents == 4;
    NSInteger numberOfComponents = hasAlpha ? 4 : 3;

    CGFloat colorMax = 1.0;
    CGFloat p = colorMax / 100.0;

    CGFloat redP = fabs(c1.red / p - c2.red / p);
    CGFloat greenP = fabs(c1.green / p - c2.green / p);
    CGFloat blueP = fabs(c1.blue / p - c2.blue / p);
    CGFloat alphaP = 0;

    if (hasAlpha)
        alphaP = fabs(c1.alpha / p - c2.alpha / p);

    return (redP + greenP + blueP + alphaP) / (CGFloat)numberOfComponents;
}

Answer #5

Hai provato [myColor isEqual:someOtherColor] ?


Answer #6

Ho convertito la risposta di raf a Swift 4 (un sacco di cambiamenti nell'API CGColor ), rimosso lo CGColor forza e diminuito il rientro grazie all'uso generoso della guard :

@extension UIColor {
    func isEqualToColor(otherColor: UIColor) -> Bool {
        if self == otherColor {
            return true
        }
        let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
        let convertColorToRGBSpace: ((UIColor) -> UIColor?) = { (color) -> UIColor? in
            guard color.cgColor.colorSpace?.model == .monochrome else {
                return color
            }
            guard let oldComponents = color.cgColor.components else {
                return nil
            }
            let newComponents = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
            guard let colorRef = CGColor(colorSpace: colorSpaceRGB, components: newComponents) else {
                    return nil
            }
            return UIColor(cgColor: colorRef)
        } 

        guard let selfColor = convertColorToRGBSpace(self), 
              let otherColor = convertColorToRGBSpace(otherColor) else {
            return false
        }
        return selfColor.isEqual(otherColor)
    }
}

Answer #7

Possono verificarsi alcuni strani errori di arrotondamento. Questo può essere il motivo per cui un oggetto è impostato su un colore e il colore su cui lo hai impostato non corrisponde esattamente.

Ecco come l'ho risolto:

private func compareColors (c1:UIColor, c2:UIColor) -> Bool{
    // some kind of weird rounding made the colors unequal so had to compare like this

    var red:CGFloat = 0
    var green:CGFloat  = 0
    var blue:CGFloat = 0
    var alpha:CGFloat  = 0
    c1.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

    var red2:CGFloat = 0
    var green2:CGFloat  = 0
    var blue2:CGFloat = 0
    var alpha2:CGFloat  = 0
    c2.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

    return (Int(green*255) == Int(green2*255))

}

Questo codice può essere migliorato non solo confrontando 1 ma confrontando tutti i componenti. Ad esempio rosso + verde + blu + alfa == rosso2 + verde2 + blu2 + alfa2


Answer #8

Potrebbe essere un po 'troppo tardi, ma CoreGraphics ha un'API più semplice per raggiungere questo obiettivo:

CGColorEqualToColor(myColor.CGColor, [UIColor clearColor].CGColor)

Come la documentazione dice:

Indica se due colori sono uguali. Due colori sono uguali se hanno spazi colore uguali e componenti a colori numericamente uguali.

Questo risolve molti problemi e algoritmi che perdono / personalizzati.


Answer #9

Sto usando questa estensione che funziona per me in tutti i casi.

/***** UIColor Extension to Compare colors as string *****/
@interface UIColor (compare)
- (BOOL)compareWithColor:(UIColor *)color;
@end

@implementation UIColor(compare)
- (BOOL)compareWithColor:(UIColor *)color {
    return ([[[CIColor colorWithCGColor:self.CGColor] stringRepresentation] isEqualToString:[[CIColor colorWithCGColor:color.CGColor] stringRepresentation]]);
}
@end
/**** End ****/

La speranza aiuta qualcuno.

Nota: #ffffff equivale a [UIColor whiteColor] di questa estensione


Answer #10

la soluzione di samvermette tradotta in swift:

extension UIColor {
    func isEqualToColor(otherColor : UIColor) -> Bool {
        if self == otherColor {
            return true
        }

        let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
        let convertColorToRGBSpace : ((color : UIColor) -> UIColor?) = { (color) -> UIColor? in
            if CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == CGColorSpaceModel.Monochrome {
                let oldComponents = CGColorGetComponents(color.CGColor)
                let components : [CGFloat] = [ oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1] ]
                let colorRef = CGColorCreate(colorSpaceRGB, components)
                let colorOut = UIColor(CGColor: colorRef!)
                return colorOut
            }
            else {
                return color;
            }
        }

        let selfColor = convertColorToRGBSpace(color: self)
        let otherColor = convertColorToRGBSpace(color: otherColor)

        if let selfColor = selfColor, otherColor = otherColor {
            return selfColor.isEqual(otherColor)
        }
        else {
            return false
        }
    }
}

Answer #11
if([myimage.backgroundColor isEqual:[UIColor greenColor]])




uicolor