2010-10-23 15 views
6

Ho bisogno di scurire un UIImageView quando viene toccato, quasi esattamente come le icone sul trampolino (schermata iniziale).come scurire un UIImageView

Devo essere aggiunto UIView con uno sfondo 0,5 alfa e nero. Questo sembra maldestro. Dovrei usare Layer o qualcosa (CALayers).

+0

È possibile utilizzare un 'UIButton' invece? –

risposta

4

Che ne dici di sottoclasse UIView e aggiunta di UIImage ivar (immagine chiamata)? Quindi potresti sovrascrivere -drawRect: qualcosa di simile, a patto di avere un ivar booleano chiamato premuto che è stato impostato mentre è stato toccato.

- (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); 
    } 
} 

Si vorrebbe provare con i valori RGBA sopra. E, ovviamente, le forme non rettangolari richiedono un po 'più di lavoro, come un CGMutablePathRef.

+1

L'UIImage su domanda capita di essere in una sottoclasse di UIView già così posso farlo. Tuttavia, perché dovrei farlo nel metodo drawRect, non potrei farlo direttamente nei tocchi? –

+0

Se si tratta di modificare alcune impostazioni, ciò avverrebbe in tocco. E potrebbe essere ripristinato in touchEnded. Ma il disegno attuale dovrebbe, penso, accadere in drawRect. Potrebbe essere necessario chiamare setNeedsDisplay sull'istanza della sottoclasse UIView in combinazione con le modifiche allo stato attivate. (Questo potrebbe essere fatto meglio nel setter personalizzato.) Non sono sicuro di come si comporterebbe una sottoclasse di UIImageView se il suo drawRect fosse sovrascritto. Questo è il motivo per cui ho suggerito l'approccio 'più sicuro' di scrivere fondamentalmente il tuo UIImageView. Spero che questo ti aiuti. – westsider

+0

hai frainteso il mio commento, perché il disegno personalizzato deve essere eseguito in drawRect. Perché non riesco a mettere tutto il CGContext ... Codice in tocco. Began. –

1

UIImageView può avere più immagini; potresti avere due versioni dell'immagine e passare a quella più scura quando necessario.

6

Vorrei consentire a UIImageView di gestire il disegno reale dell'immagine, ma di commutare l'immagine su un'immagine precedentemente oscurata. Ecco un codice che ho usato per generare immagini scurite con alfa mantenuto:

+ (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

Grazie! Questo è quello che sto cercando. – VietHung

Problemi correlati