2012-03-10 17 views
10

Quiero rotar una capa con una imagen en la esquina superior izquierda, y no en el centro. De acuerdo con los documentos, establecí la propiedad anchorPoint en [0, 1]. La vista gira en mi ejemplo en 50 °, pero antes de que comience a animarse, la vista salta a otro punto en la pantalla.¿Cómo rotar una capa en un punto de ancla específico sin saltear?

self.shakeTag.layer.anchorPoint = CGPointMake(0.0f, 1.0f); 
[UIView beginAnimations:@"rotate" context:nil]; 
[self.shakeTag.layer setTransform: 
    CATransform3DRotate(CATransform3DIdentity, 
    radians(50.0), 0.0f, 0.0f, 1.0f)]; 
[UIView commitAnimations]; 

radians() se define así:

static inline double radians (double degrees) {return degrees * M_PI/180;} 

Cuando utilizo una imagen que es 4 veces el tamaño y tiene una gran cantidad de píxeles transparentes, I puede girar en el punto de anclaje predeterminado [0.5 , 0.5], pero no quiero perder el espacio para píxeles invisibles. ¿Alguna idea de cómo puedo evitar que la capa salte antes de que tenga lugar la rotación?

+0

Si piensa que la respuesta es correcta, sería impresionante si aceptas. – Krumelur

+0

necesita ver mi respuesta aquí: http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

Respuesta

20

Cambiar el punto de anclaje afecta el posicionamiento de su vista. Tendrá que cambiar la posición de la vista si cambia el punto de anclaje y si desea mantener su vista donde está actualmente. Usar algo como esto (tomado de aquí: Layer Position jumps at start of (Core) Animation) para establecer su punto de anclaje y compensar los cambios de posición:

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view 
{ 
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform); 

    CGPoint position = view.layer.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    view.layer.position = position; 
    view.layer.anchorPoint = anchorPoint; 
} 

también ver aquí para más detalles: Changing my CALayer's anchorPoint moves the view

Cuestiones relacionadas