2009-09-30 15 views
49

jestem coraz UIColor wrócił z tej metody:Jak uzyskać czerwony kolor niebieski i alfa z obiektu UIColor?

- (UIColor *)getColor { 
return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0]; 
} 

i coraz kolor tak:

SelectedColor=[(ColorPickerView *)alertView getColor]; 

Teraz chcę dostać czerwony, zielony, niebieski z selectedColor, w celu wykorzystania tych wartości. Chcę wartości od 0 do 1. Również gdy używam SelectedColor.CGColor, moja aplikacja ulega awarii.

+8

Nota boczna; powinieneś spojrzeć na konwencje nazewnictwa. 'getColor' jest zły z dwóch powodów, po pierwsze używa prefiksu get, który jest częstym błędem dla programistów Java, po drugie nie opisuje, jaki to jest kolor. Lepszą nazwą jest prawdopodobnie 'userSelectedColor'.Zobacz, w jaki sposób pobierają nazwę UIKit i właściwości, i wykonaj następujące czynności. – PeyloW

Odpowiedz

107

Przyczyną katastrofy podczas dostępu SelectedColor.CGColor mogłoby być to, że nie zachowują wynik z getColor, być może to, czego potrzebujesz to:

SelectedColor = [[(ColorPickerView *)alertView getColor] retain]; 

można uzyskać składową koloru RGB z UIColor to tylko używanie przestrzeni kolorów RGB, ponieważ używasz colorWithRed:green:blue:alpha:, co nie jest problemem, ale zmieniaj to, jeśli twój kod się zmieni.

z tym jest umysł coraz składowych koloru jest bardzo proste:

const CGFloat* components = CGColorGetComponents(SelectedColor.CGColor); 
NSLog(@"Red: %f", components[0]); 
NSLog(@"Green: %f", components[1]); 
NSLog(@"Blue: %f", components[2]); 
NSLog(@"Alpha: %f", CGColorGetAlpha(SelectedColor.CGColor)); 
+0

dzięki PeyloW. Czy wiesz o maskowaniu obrazu w ihpone? –

+0

Jak ukryć zaokrąglone rogi i takie? Na pewno dodaj nowe pytanie. – PeyloW

+0

Cześć PeyloW! Użyłem tego samego, ale daje on komponenty koloru zielonego, kiedy przechodzę w czarny kolor. Czy wiesz, dlaczego tak się dzieje? Widzisz to samo ogłoszenie tutaj-> http://stackoverflow.com/questions/4155642/how-to-get-color-components-of-a-cgcolor-correctly – Ganesh

4

Myślę, że powinieneś mieć a look here, gdzie przewodnik Arsa pokazuje, jak rozszerzyć klasę UIColor z obsługą dostępu do komponentów koloru.

1

Ten fragment kodu powinien pracować zarówno z RGB i skali szarości:

CGFloat *components = (CGFloat *) CGColorGetComponents(<UIColor instance>.CGColor); 
if(CGColorGetNumberOfComponents(<UIColor instance>.CGColor) == 2) 
{ 
    //assuming it is grayscale - copy the first value 
    components[2] = components[1] = components[0]; 
} 
22

Rozwiązanie to działa dla kolorów niż RGB a także np kolor czarny lub biały.

UIColor *color = [UIColor blackColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 
// iOS 5 
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    // < iOS 5 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(color.CGColor) == 2) { 
    CGFloat hue; 
    CGFloat saturation; 
    CGFloat brightness; 
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 

} 
+0

Blok kodu "inny niż RGB" jest także tylko iOS5 +. Możesz go oznaczyć jako taki. –

7

W większości przypadków będzie to działało, chyba że konwersja do RGB nie działa.

float red, green, blue, alpha; 
BOOL conversionToRGBWentOk = [color getRed:&red green:&green blue:&blue alpha:&alpha]; 

Oto, do czego służą te metody. Jeśli conversionToRGBWentOk jest NO, pojawi się problem.

+1

Dziękuję, twoje było najlepsze rozwiązanie, jakie kiedykolwiek widziałem. –

+1

Powoduje to jednak awarię symulatora ios4.3. Jest zgodny z IOS5 +. –

2

po prostu robi to proste

CGFloat red,green,blue,alpha; 

[UIColorobject getRed:&red green:&green blue:&blue alpha:&alpha]; 

w czerwony, zielony, niebieski i alfa uzyskać wartość RGB jeśli masz jakiekolwiek pytania prosimy zapytać ...

Dzięki

+0

Dwie osoby już opublikowały ten kod ... – nschum

0

Wystarczy dodać właściwość ColorLiteral, jak pokazano w przykładzie. Xcode poprosi cię o całą listę kolorów, które możesz wybrać.

self.view.backgroundColor = ColorLiteral 
0

Myślę, że to byłaby droga. Jeśli potrzebujesz również użyć parametru alfa, możesz interpolować alfa z wejścia tak, jak robisz dla R G i B.

- (UIColor *)getColorBetweenColor:(UIColor *)color1 andColor:(UIColor *)color2 percentage:(CGFloat)percent { 
    CGFloat red1, green1, blue1, alpha1; 
    CGFloat red2, green2, blue2, alpha2; 

    [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1]; 
    [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2]; 

    double resultRed = red1 + percent * (red2 - red1); 
    double resultGreen = green1 + percent * (green2 - green1); 
    double resultBlue = blue1 + percent * (blue2 - blue1); 

    return [UIColor colorWithRed:resultRed green:resultGreen blue:resultBlue alpha:1]; 
} 
Powiązane problemy