Cámara personalizada de UIImagePickerController de iOS Recortar a cuadrado

Estoy tratando de crear una camera como Instagram, donde el usuario puede ver un cuadro y la image recortará a ese cuadro. Por alguna razón, la camera no llega hasta el final de la pantalla y corta casi al final. También me pregunto ¿cómo voy a recortar la image para ser exactamente 320×320 dentro de ese cuadrado?

introduzca la descripción de la imagen aquí

Esta es la forma más fácil de hacerlo (sin reimplementar UIImagePickerController ). Primero, use una superposition para hacer que el campo de la camera parezca cuadrado. Aquí hay un ejemplo para pantallas de 3.5 "(debería actualizarlo para que funcione para iPhone 5):

 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.sourceType = source; if (source == UIImagePickerControllerSourceTypeCamera) { //Create camera overlay CGRect f = imagePickerController.view.bounds; f.size.height -= imagePickerController.navigationBar.bounds.size.height; CGFloat barHeight = (f.size.height - f.size.width) / 2; UIGraphicsBeginImageContext(f.size); [[UIColor colorWithWhite:0 alpha:.5] set]; UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, barHeight), kCGBlendModeNormal); UIRectFillUsingBlendMode(CGRectMake(0, f.size.height - barHeight, f.size.width, barHeight), kCGBlendModeNormal); UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f]; overlayIV.image = overlayImage; [imagePickerController.cameraOverlayView addSubview:overlayIV]; } imagePickerController.delegate = self; [self presentViewController:imagePickerController animated:YES completion:nil]; 

Luego, después de recuperar una image del UIImagePickerController , UIImagePickerController en un cuadrado con algo como esto:

 //Crop the image to a square CGSize imageSize = image.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; if (width != height) { CGFloat newDimension = MIN(width, height); CGFloat widthOffset = (width - newDimension) / 2; CGFloat heightOffset = (height - newDimension) / 2; UIGraphicsBeginImageContextWithOptions(CGSizeMake(newDimension, newDimension), NO, 0.); [image drawAtPoint:CGPointMake(-widthOffset, -heightOffset) blendMode:kCGBlendModeCopy alpha:1.]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } 

Y tu estas listo.

La respuesta de @Anders estaba muy cerca de corregirme en el iPhone 5. Hice la siguiente modificación para agregar una superposition codificada para iPhone 5:

 CGRect f = imagePickerController.view.bounds; f.size.height -= imagePickerController.navigationBar.bounds.size.height; UIGraphicsBeginImageContext(f.size); [[UIColor colorWithWhite:0 alpha:.5] set]; UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, 124.0), kCGBlendModeNormal); UIRectFillUsingBlendMode(CGRectMake(0, 444, f.size.width, 52), kCGBlendModeNormal); UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f]; overlayIV.image = overlayImage; overlayIV.alpha = 0.7f; [imagePickerController setCameraOverlayView:overlayIV];` 

Espero que esto ayude a alguien.