2012-03-10 15 views
10

Voglio ruotare un livello con un'immagine nell'angolo in alto a sinistra e non al centro. Secondo i documenti ho impostato la proprietà anchorPoint su [0, 1]. La vista ruota nel mio esempio di 50 °, ma prima che inizi ad animare, la vista passa ad un altro punto sullo schermo.Come ruotare un livello in un punto di ancoraggio specifico senza saltare?

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() è definito così:

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

Quando uso un'immagine che è 4 volte la dimensione e ha un sacco di pixel trasparenti, che può ruotare in corrispondenza del punto di ancoraggio predefinito [0.5 , 0.5], ma non voglio sprecare lo spazio per i pixel invisibili. Qualche idea su come posso evitare che il livello salti prima che avvenga la rotazione?

+0

Se pensate che la risposta è corretta, sarebbe fantastico se accetti. – Krumelur

+0

è necessario vedere la mia risposta qui: http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

risposta

20

La modifica del punto di ancoraggio influisce sul posizionamento della vista. Dovrai cambiare la posizione della vista se cambi il punto di ancoraggio e se vuoi mantenere la tua vista dove è attualmente. Usa qualcosa come questo (tratto da qui: Layer Position jumps at start of (Core) Animation) per impostare il punto di ancoraggio e di compensare i cambiamenti di posizione:

-(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; 
} 

vedere anche qui per maggiori dettagli: Changing my CALayer's anchorPoint moves the view

Problemi correlati