UIImage de una región de UIView

Estoy intentando recortar una región de una UIView , en un UIImage para su posterior reutilización.

He encontrado este código de algunos fragments:

  CGRect _frameIWant = CGRectMake(100, 100, 100, 100); UIGraphicsBeginImageContext(view.frame.size); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; //STEP A: GET AN IMAGE FOR THE FULL FRAME UIImage *_fullFrame = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //STEP B: CLIP THE IMAGE CGImageRef _regionImage = CGImageCreateWithImageInRect([_fullFrame CGImage], _frameIWant); UIImage *_finalImage = [UIImage imageWithCGImage:_regionImage]; CGImageRelease(_regionImage); 

'view' es la UIView que estoy recortando y _finalImage es el UIImage que quiero.

El código funciona sin problema, sin embargo, es un poco lento. Creo que se podría get algo de performance tomando solo la parte de la pantalla directamente en el Paso A.

Estoy buscando algo así como renderInContext: withRect: o UIGraphicsGetImageFromCurrentImageContextWithRect() jeje.

Aún no he encontrado nada :(, por favor ayúdame si sabes alguna alternativa.

Este método graba una región de la vista con less time de memory y CPU:

 -(UIImage*)clippedImageForRect:(CGRect)clipRect inView:(UIView*)view { UIGraphicsBeginImageContextWithOptions(clipRect.size, YES, 1.f); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(ctx, -clipRect.origin.x, -clipRect.origin.y); [view.layer renderInContext:ctx]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } 

Podrías tratar de rasterizar primero UIView:

 view.layer.shouldRasterize = YES; 

Tengo un éxito limitado usando esto, pero estoy diciendo que estoy haciendo lo mismo que tú (más la línea anterior) y funciona bien. ¿En qué context estás haciendo esto? Puede ser su problema de performance.

EDIT: También podría intentar usar los límites de la vista en lugar del marco de la vista. No siempre son los mismos.

Versión Swift de la solución @ phix23. agregar escala

 func clippedImageForRect(clipRect: CGRect, inView view: UIView) -> UIImage { UIGraphicsBeginImageContextWithOptions(clipRect.size, true, UIScreen.mainScreen().scale); let ctx = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(ctx, -clipRect.origin.x, -clipRect.origin.y); view.layer.renderInContext(ctx!) let img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img }