¿Cómo rotar UIImageView 90 grados dentro de un UIScrollView con el tamaño de image correcto y el desplazamiento?

Tengo una image dentro de un UIImageView que está dentro de un UIScrollView. Lo que quiero hacer es rotar esta image 90 grados para que esté en el paisaje por defecto y establecer el zoom inicial de la image para que toda la image se ajuste a la vista de desplazamiento y luego permitir que se amplíe hasta el 100% hasta el zoom mínimo nuevamente.

Esto es lo que tengo hasta ahora:

self.imageView.transform = CGAffineTransformMakeRotation(-M_PI/2); float minimumScale = scrollView.frame.size.width / self.imageView.frame.size.width; scrollView.minimumZoomScale = minimumScale; scrollView.zoomScale = minimumScale; scrollView.contentSize = CGSizeMake(self.imageView.frame.size.height,self.imageView.frame.size.width); 

El problema es que si configuro la transformación, no aparece nada en la vista de desplazamiento. Sin embargo, si comenté la transformación, todo funciona, ¡salvo que la image no esté en la orientación horizontal que quiero que sea!

Si aplico la transformación y elimino el código que establece las properties minimumZoomScale y zoomScale, entonces la image aparece en la orientación correcta, sin embargo con el zoomScale incorrecto y parece que la propiedad contentSize no está configurada correctamente, ya que no desplácese hasta el borde de la image en la dirección izquierda / derecha, sin embargo, arriba y abajo, pero sobre el borde.

Nota: la image se está cargando desde una URL

Tal vez la rotation de la image se ajuste a sus necesidades:

  UIImage* rotateUIImage(const UIImage* src, float angleDegrees) { UIView* rotatedViewBox = [[UIView alloc] initWithFrame: CGRectMake(0, 0, src.size.width, src.size.height)]; float angleRadians = angleDegrees * ((float)M_PI / 180.0f); CGAffineTransform t = CGAffineTransformMakeRotation(angleRadians); rotatedViewBox.transform = t; CGSize rotatedSize = rotatedViewBox.frame.size; [rotatedViewBox release]; UIGraphicsBeginImageContext(rotatedSize); CGContextRef bitmap = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); CGContextRotateCTM(bitmap, angleRadians); CGContextScaleCTM(bitmap, 1.0, -1.0); CGContextDrawImage(bitmap, CGRectMake(-src.size.width / 2, -src.size.height / 2, src.size.width, src.size.height), [src CGImage]); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

Creo que la forma más fácil (y también segura de subprocesss) es hacer:

 //assume that the image is loaded in landscape mode from disk UIImage * LandscapeImage = [UIImage imageNamed: imgname]; UIImage * PortraitImage = [[UIImage alloc] initWithCGImage: LandscapeImage.CGImage scale: 1.0 orientation: UIImageOrientationLeft]; 

Cualquier cálculo que haga basado en el marco de la image de vista probablemente se debe hacer antes de aplicarle alguna transformación. Pero en realidad sugeriría hacer esos cálculos basados ​​en el tamaño del UIImage, no en el UIImageView. Luego, establezca tanto el marco de UIImageView como el contentSize de UIScrollView en function de eso.

La sugerencia de Max es buena, aunque con una image más grande podría ser un asesino del performance. ¿Estás mostrando esta image desde los resources de tu aplicación? Si es así, ¿por qué no simplemente rotar las imágenes antes de que siquiera compile la aplicación?

Hay una solución mucho más fácil que también es más rápida, simplemente haz esto:

 - (void) imageRotateTapped:(id)sender { [UIView animateWithDuration:0.33f animations:^() { self.imageView.transform = CGAffineTransformMakeRotation(RADIANS(self.rotateDegrees += 90.0f)); self.imageView.frame = self.imageView.superview.bounds; // change this to whatever rect you want }]; } 

Cuando el usuario haya terminado, necesitará crear una nueva image rotada, pero eso es muy fácil de hacer.

Estaba usando la respuesta aceptada por un time hasta que notamos que las rotaciones no cuadradas basadas en imágenes tomadas directamente de la camera parecían estiradas (se rotaron como se desea, solo el ancho / alto del cuadro no se ajustó).

Gran explicación / publicación aquí de Trevor: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

Al final, fue una import muy simple del código de Trevor que usa categorías para agregar un método resizedImage:interpoationQuality a UIImage. Entonces sí, usuario, ten cuidado, si aún funciona para ti, genial. Pero si no es así, echaré un vistazo a la biblioteca.