iphone objective-c uiimageview layer

iphone - cómo oscurecer un UIImageView



objective-c layer (3)

¿Qué hay de subclasificar UIView y agregar un UIImage ivar (imagen llamada)? Luego, puede anular -drawRect: algo así, siempre que tenga un booleano ivar llamado presionado que se configuró al tocarlo.

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

Querrá experimentar con los valores RGBA anteriores. Y, por supuesto, las formas no rectangulares requerirían un poco más de trabajo, como un CGMutablePathRef.

Necesito oscurecer un UIImageView cuando se toca, casi exactamente como los iconos en el trampolín (pantalla de inicio).

Debería agregar UIView con un fondo 0.5 alfa y negro. Esto parece torpe Debería estar usando capas o algo (CALayers).


UIImageView puede tener múltiples imágenes; podría tener dos versiones de la imagen y cambiar a la más oscura cuando sea necesario.


Dejaría que UIImageView maneje el dibujo real de la imagen, pero alternar la imagen a una que haya sido oscurecida de antemano. Aquí hay un código que he usado para generar imágenes oscurecidas con alpha mantenido:

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