/ / ¿Por qué después de girar UIImageView se cambia el tamaño? - Objective-c, ios, cacao-touch, ios5

¿Por qué después de rotar el tamaño de UIImageView se está cambiando? - objetivo-c, ios, cacao-toque, ios5

Soy nuevo en el uso de transformaciones. Y aún confío en cómo están funcionando.

Lo que estoy tratando de hacer es rotar miUIImageView con ángulo dado. Pero después de rotar, está cambiando el tamaño de la imagen, haciéndose más pequeña. También estoy escalando para ImageView para que no quede al revés.¿Cómo rotar y mantener el tamaño, que se proporcionó en CGRectMake, cuando se asignó ImageView?

    UIImageView *myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(x,y,width,height)];

myImageView.contentMode = UIViewContentModeScaleAspectFit;

[myImageView setImage:[UIImage imageNamed:@"image.png"]];

myImageView.layer.anchorPoint = CGPointMake(0.5,0.5);

CGAffineTransform newTransform;

myImageView.transform = CGAffineTransformMakeScale(1,-1);

newTransform = CGAffineTransformRotate(newTransform, 30*M_PI/180);

[self.window addSubview:myImageView];

¡Muchas gracias!

Respuestas

15 para la respuesta № 1

Ok, prometí que lo investigaría, así que aquí está mi respuesta:

Creo una escena que debería ser algo equivalente a la suya, codifique de la siguiente manera:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width/2-100,
self.view.bounds.size.height/2-125,
200,
250)];

imageView.image = [UIImage imageNamed:@"testimage.jpg"];
imageView.contentMode = UIViewContentModeScaleAspectFill;

/*
* I added clipsToBounds, because my test image didn"t have a size of 200x250px
*/
imageView.clipsToBounds = YES;

[self.view addSubview:imageView];

NSLog(@"frame: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds: %@",[NSValue valueWithCGRect:imageView.bounds]);

imageView.layer.anchorPoint = CGPointMake(0.5, 0.5);
imageView.transform = CGAffineTransformMakeRotation(30*M_PI/180);

NSLog(@"frame after rotation: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds after rotation: %@",[NSValue valueWithCGRect:imageView.bounds]);

Este código supone que está utilizando ARC. Si no agregar

[imageView release];

al final.

Con este código, los registros se ven así:

[16221:207] frame: NSRect: {{60, 105}, {200, 250}}
[16221:207] bounds: NSRect: {{0, 0}, {200, 250}}
[16221:207] frame after rotation: NSRect: {{10.897461, 71.746826}, {298.20508, 316.50635}}
[16221:207] bounds after rotation: NSRect: {{0, 0}, {200, 250}}

Como puede ver, los límites siempre permanecen igual. Lo que realmente cambia debido a la rotación es el marco, porque una imagen que se ha girado 30 ° C es, por supuesto, más ancha que si no se hubiera girado. Y dado que el punto central se ha establecido en el centro real de la vista el origen del marco también cambia (se empuja hacia la izquierda y la parte superior). Observe que el tamaño de la imagen en sí no cambia. No utilicé la transformación de escala, ya que el resultado se puede lograr sin escalar.

Pero para que quede más claro, aquí hay algunas imágenes para usted (rotación de 0 °, 30 ° 90 °): Rotaciones de 0 °, 30 ° y 90 ° de UIImageView

Ya se ven bastante similares, ¿verdad? Dibujé los cuadros reales para dejar en claro cuál es la diferencia entre los límites y el cuadro. El siguiente realmente lo deja claro. Superpuse todas las imágenes, rotándolas por los grados negativos con los que se rotó el UIImageView, dando el siguiente resultado : UIImageViews superpuestos para mostrar que el tamaño no cambia

Así que ya ves que es bastante sencillo cómorotar imágenes. Ahora a su problema que realmente desea que el marco permanezca igual. Si desea que el cuadro final tenga el tamaño de su cuadro original (en este ejemplo, con un ancho de 200 y una altura de 250), tendrá que escalar el cuadro resultante. Pero esto, por supuesto, dará como resultado el escalado de la imagen, que no desea. De hecho, creo que un marco más grande no será un problema para usted, solo necesita saber que debe tenerlo en cuenta debido a la rotación.

En breve: no es posible tener un UIImageView que tendrá el mismo marco después de la rotación. Esto no es posible para ninguna UIView. Solo piense en un rectángulo. Si lo gira, no será un rectángulo después de la rotación, ¿verdad?

Por supuesto, puedes poner tu UIImageView dentrootro UIView que tendrá un marco no girado con un ancho de 200 y una altura de 250, pero eso sería superficial, ya que realmente no cambiará el hecho de que un rectángulo girado tiene un ancho y una altura diferentes al original.

Espero que esto ayude. :)


0 para la respuesta № 2

No establezca el contentMode que UIImageViewhereda de UIView y conduce a los cambios en el marco de acuerdo con la escala, la transformación y la rotación del dispositivo de acuerdo con el UIViewContentMode que seleccione.

Además, si solo desea rotar, puede cambiar el marco usando: -

[UIView beginAnimations:@"Rotate" context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationDelegate:self];
CGRect frame=yourView.frame;
frame.origin.y+=distance you want to rotate;
yourview.frame=frame;
[UIView commitAnimations];
}

si no quieres la animación solo cambia el marco

Intenta usar esto: -

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 0.5f;
animation.repeatCount = HUGE_VALF;     // HUGE_VALF is defined in math.h so import it
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"];