Recortar una image en retrato en iOS 7 da como resultado una orientación incorrecta

Tengo la siguiente function, anterior a iOS 7 y XCode 5 funcionó como esperaba. La function toma una image y un cropSize. La image es la que se recortará a un tamaño especificado, que está definido por CGSize cropSize. El propósito de la function es recortar la image a un tamaño determinado y luego devolver la image recortada.

- (UIImage *) cropImage:(UIImage *)originalImage cropSize:(CGSize)cropSize { //calculate scale factor to go between cropframe and original image float SF = originalImage.size.width / cropSize.width; //find the centre x,y coordinates of image float centreX = originalImage.size.width / 2; float centreY = originalImage.size.height / 2; //calculate crop parameters float cropX = centreX - ((cropSize.width / 2) * SF); float cropY = centreY - ((cropSize.height / 2) * SF); CGRect cropRect = CGRectMake(cropX, cropY, (cropSize.width *SF), (cropSize.height * SF)); CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], cropRect); //keep orientation if landscape UIImage *newImage; if (originalImage.size.width > originalImage.size.height || originalImage.size.width == originalImage.size.height) { newImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:originalImage.imageOrientation]; } else { newImage = [UIImage imageWithCGImage:imageRef]; } CGImageRelease(imageRef); //Now want to scale down cropped image! //want to multiply frames by 2 to get retina resolution CGRect scaledImgRect = CGRectMake(0, 0, (cropSize.width * 2), (cropSize.height * 2)); UIGraphicsBeginImageContextWithOptions(scaledImgRect.size, NO, [UIScreen mainScreen].scale); [newImage drawInRect:scaledImgRect]; UIImage *scaledNewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledNewImage; } 

El problema es que todo funciona bien con un UIImage que se pasa en orientación horizontal, la image se recorta como se esperaba, sin embargo, si la image pasada se tomó en vertical, entonces la image resultante (el resultado recortado en New Image escalada ) se gira 90 grados por un lado, lo que no quiero.

Es como si la image del retrato se estuviera trabajando como si estuviera en el paisaje, por lo que la function recortó lo que debería ser una image orientada verticalmente en el paisaje en lugar de en el retrato.
Esto no es tan evidente si el área de recorte es cuadrada, sin embargo, si el área a recortar es un rectángulo de paisaje, entonces lo recorta a lo largo de la longitud del retrato en lugar del ancho. ¡Espero que tenga sentido!

Este problema no ocurrió antes de iOS 7 y XCode 5 … así que no estoy seguro de qué ha cambiado exactamente. Cualquier ayuda apreciada, gracias.

Resuelto este problema con la ayuda de una respuesta aquí: https://stackoverflow.com/a/14712184/521653

 - (UIImage *) cropImage:(UIImage *)originalImage cropSize:(CGSize)cropSize { NSLog(@"original image orientation:%d",originalImage.imageOrientation); //calculate scale factor to go between cropframe and original image float SF = originalImage.size.width / cropSize.width; //find the centre x,y coordinates of image float centreX = originalImage.size.width / 2; float centreY = originalImage.size.height / 2; //calculate crop parameters float cropX = centreX - ((cropSize.width / 2) * SF); float cropY = centreY - ((cropSize.height / 2) * SF); CGRect cropRect = CGRectMake(cropX, cropY, (cropSize.width *SF), (cropSize.height * SF)); CGAffineTransform rectTransform; switch (originalImage.imageOrientation) { case UIImageOrientationLeft: rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI_2), 0, -originalImage.size.height); break; case UIImageOrientationRight: rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI_2), -originalImage.size.width, 0); break; case UIImageOrientationDown: rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI), -originalImage.size.width, -originalImage.size.height); break; default: rectTransform = CGAffineTransformIdentity; }; rectTransform = CGAffineTransformScale(rectTransform, originalImage.scale, originalImage.scale); CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], CGRectApplyAffineTransform(cropRect, rectTransform)); UIImage *result = [UIImage imageWithCGImage:imageRef scale:originalImage.scale orientation:originalImage.imageOrientation]; CGImageRelease(imageRef); //return result; //Now want to scale down cropped image! //want to multiply frames by 2 to get retina resolution CGRect scaledImgRect = CGRectMake(0, 0, (cropSize.width * 2), (cropSize.height * 2)); UIGraphicsBeginImageContextWithOptions(scaledImgRect.size, NO, [UIScreen mainScreen].scale); [result drawInRect:scaledImgRect]; UIImage *scaledNewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledNewImage; } 

Ese es el método actualizado allí. Implementé el código de la respuesta vinculada a mi método y resuelve los problemas. ¡Extraño que no los tuviera antes de iOS 7!