2010-10-23 10 views
6

Potrzebuję przyciemnić UIImageView kiedy zostanie dotknięty, prawie dokładnie jak ikony na trampolinie (ekran główny).jak przyciemnić UIImageView

Należy dodać UIView z 0,5 alfa i czarnym tłem. Wydaje się to niezgrabne. Czy powinienem używać Warstw lub czegoś (CALayers).

+0

Czy można zamiast tego użyć 'UIButton'? –

Odpowiedz

4

Co powiesz na podklasę UIView i dodanie obiektu Ivar (zwanego obrazem) UII? Wtedy możesz przesłonić -drawRect: coś takiego, pod warunkiem, że masz wywołane boolean ivar, które zostało ustawione podczas dotknięcia.

- (void)drawRect:(CGRect)rect 
{ 
[image drawAtPoint:(CGPointMake(0.0, 0.0))]; 

// if pressed, fill rect with dark translucent color 
if (pressed) 
    { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 
    CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 0.5); 
    CGContextFillRect(ctx, rect); 
    CGContextRestoreGState(ctx); 
    } 
} 

Chciałbyś eksperymentować z wartościami RGBA powyżej. Oczywiście, kształty inne niż prostokątne wymagałyby nieco więcej pracy - na przykład CGMutablePathRef.

+1

UIImage na pytanie stało się już w podklasach UIView, więc mogę to zrobić. Jednak dlaczego miałbym to zrobić w metodzie drawRect, czy nie mógłbym tego zrobić bezpośrednio w dotkniętych dotknięciami? –

+0

Jeśli chodzi o przełączanie niektórych ustawień, to będzie to miało miejsce w przypadku dotknięćBegan. I może zostać przełączony z powrotem w dotknięcia. Ale rzeczywisty rysunek byłby, moim zdaniem, dziełem w drawRect. Może być konieczne wywołanie metody setNeedsDisplay na instancji podklasy UIView w połączeniu ze zmianami stanu przełączania. (Najlepiej zrobić to w ustawieniach niestandardowych). Nie jestem pewien, jak zachowa się podklasa UIImageView, jeśli jej drawRect zostanie nadpisany. Właśnie dlatego zaproponowałem "bezpieczniejsze" podejście polegające na napisaniu własnego UIImageView. Mam nadzieję że to pomoże. – westsider

+0

źle zrozumiałeś mój komentarz, dlaczego niestandardowy rysunek musi się zdarzyć w drawRect. Dlaczego nie mogę umieścić całego CGContext ... Code in touchesBegan. –

1

UIImageView może mieć wiele obrazów; możesz mieć dwie wersje obrazu i w razie potrzeby przełączyć się na ciemniejszą.

6

Pozwoliłbym UIImageView obsługiwać rzeczywisty rysunek obrazu, ale przełączam obraz do tego, który został wcześniej przyciemniony. Oto kod, którego użyłem do wygenerowania zaciemnionych obrazów z utrzymywaną alfa:

+ (UIImage *)darkenImage:(UIImage *)image toLevel:(CGFloat)level 
{ 
    // Create a temporary view to act as a darkening layer 
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    UIView *tempView = [[UIView alloc] initWithFrame:frame]; 
    tempView.backgroundColor = [UIColor blackColor]; 
    tempView.alpha = level; 

    // Draw the image into a new graphics context 
    UIGraphicsBeginImageContext(frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [image drawInRect:frame]; 

    // Flip the context vertically so we can draw the dark layer via a mask that 
    // aligns with the image's alpha pixels (Quartz uses flipped coordinates) 
    CGContextTranslateCTM(context, 0, frame.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextClipToMask(context, frame, image.CGImage); 
    [tempView.layer renderInContext:context]; 

    // Produce a new image from this context 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    UIImage *toReturn = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    UIGraphicsEndImageContext(); 
    [tempView release]; 
    return toReturn; 
} 
+0

Dzięki! Tego właśnie szukam. – VietHung

Powiązane problemy