ios - ¿Por qué una vista cambia de posición al girarla usando CGAffineTransformMakeRotation?
objective-c (3)
Tengo la siguiente animación súper simple, básicamente estoy rotando una vista de 2 radianes desde su ángulo / centro original, gira bien, mi único malentendido es por qué la vista se mueve desde su posición original cuando ocurre la rotación.
[UIView animateWithDuration:1.0 animations:^{
self.someView.transform = CGAffineTransformMakeRotation( 2 );
}];
¿Por qué la vista se mueve cuando se gira con el código anterior?
Actualmente estoy intentando discernir la información en CGAffineTransform Reference .
Comprender el punto de anclaje
Encontré este hilo pero no muestra una respuesta concreta. ¿Por qué rotar imageView, cambia de posición?
Muchas gracias
El "anclaje" de CGAffineTransformMakeRotation
es la X, Y de la vista. Puedes intentar esto:
CGPoint center = self.someView.center;
[UIView animateWithDuration:1.0 animations:^{
self.someView.transform = CGAffineTransformMakeRotation( 2 );
self.someView.center = center;
}];
Necesita establecer el punto de anclaje de su vista para girar alrededor.
self.somview.layer.anchorPoint = CGPointMake(0.5, 0.5);
Luego comienza la rotación.
De la documentación de Apple
@property(nonatomic) CGAffineTransform transform
Los cambios en esta propiedad pueden ser animados. Utilice el método beginAnimations: context: class para comenzar y el método de clase commitAnimations para finalizar un bloque de animación. El valor predeterminado es cualquiera que sea el valor central (o el punto de anclaje si se cambia) Enlace: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ / instp / CALayer / anchorPoint
imagen desde aquí http://www.raywenderlich.com/9864/how-to-create-a-rotating-wheel-control-with-uikit
- Como ve, el punto de anclaje es el punto con el valor de 0.0 - 1.0 para X e Y cuando gira la rotación estará alrededor de estos puntos
NOTA: necesita importar QuartzCore
Estoy agregando otra respuesta debido a la solicitud @fs_tigre. El problema es con los diseños automáticos en su archivo xib, desafortunadamente no se sabe por qué afecta la transformación.
Ahora aquí están los pasos que hice para resolver el problema:
Primero, debes deshacerte de tu diseño automático (sí, tienes que hacerlo)
desmarca Usar el diseño automático
2- eliminar todas las restricciones y volver a escribir las máscaras para la vista que se rotará, como en la captura de pantalla (Aquí tengo mi cuadro azul, ver a la derecha, no se selecciona nada)
He hecho algunos cambios para el código de tu rotación
self.someView.layer.anchorPoint = CGPointMake(0.5, 0.5);
// one degree = pi/180. so...
// rotate by 90
CGFloat radians = (M_PI/180) * 90;
[UIView animateWithDuration:1.0 animations:^{
self.someView.transform = CGAffineTransformRotate(self.someView.transform, radians);
}];
Haga clic en rotate
y ver la magia :)