2012-03-08 18 views
9

Sono nuovo all'obiettivo-c e voglio aggiungere un'immagine allo schermo, twittandolo come in AS3, spostandolo da un'estremità all'altra dello schermo mentre ruota attorno al proprio punto centrale.Animazione Rotazione/Scala/Traslazione di UIImmagine allo stesso tempo

Ho provato con

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      // TRANSFORM SCREENSHOT 
      screenShotView.transform = CGAffineTransformRotate(screenShotView.transform, -M_PI * 0.05); 
      screenShotView.transform = CGAffineTransformScale(screenShotView.transform, 0.6, 0.6); 
      screenShotView.transform = CGAffineTransformTranslate(screenShotView.transform, 
                    self.webView.frame.origin.x, 
                    self.webView.frame.origin.y - self.webView.frame.size.height * 0.3 
             ); 

ma con questo codice l'immagine ruota attorno al centro della TransformIdentity. Quindi mentre ruota e muovi la rotazione esce dal controllo e l'immagine non è esattamente nella posizione in cui mi è piaciuto.

Qual è il modo corretto di ruotare e tradurre allo stesso tempo, traducendo il centro di rotazione con l'immagine?

e almeno dopo la trasformazione voglio aggiungere un pulsante di chiusura nell'angolo in alto a destra dell'immagine. per questo ho bisogno anche delle nuove coordinate dell'angolo.

thnx!

+0

potrebbe essere la pena di verificare questo fuori http://www.apeth.com/iOSBook/ch17.html –

+0

Non è molto chiaro per me ... Il problema è la trasformazione? O vuoi solo le coordinate dell'angolo in alto a destra dopo le trasformazioni? – Saphrosit

+0

scusa se non sono abbastanza chiaro. il problema è che la rotazione non è intorno al centro dell'immagine. il centro di rotazione sembra non muoversi con la traduzione in modo che la posizione finale dell'immagine dipenda dalle sue dimensioni. nel risultato l'aspetto è diverso su iPad e iPhone. – headkit

risposta

16

Ora ho terminato con il seguente codice, ma non so ancora se questa è la soluzione più avanzata.

CGAffineTransform translate = CGAffineTransformMakeTranslation(self.webView.frame.origin.x,self.webView.frame.origin.y - self.webView.frame.size.height * 0.25); 
CGAffineTransform scale = CGAffineTransformMakeScale(0.6, 0.6); 
CGAffineTransform transform = CGAffineTransformConcat(translate, scale); 
transform = CGAffineTransformRotate(transform, degreesToRadians(-10)); 

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDuration:2.0]; 

    screenShotView.transform = transform; 

[UIView commitAnimations]; 
+0

ha funzionato come un incantesimo! Grazie – MasterRazer

7

Il modo preferito di IOS 7 per fare ciò sarebbe utilizzare un oggetto di blocco. Ha diversi vantaggi rispetto al modo "vecchio" di animare. Soprattutto che può fare uso del co-processing multi-core e video. Anche la parte di richiamo 'built-in' (la parte di completamento) è molto utile, in quanto mantiene tutte le informazioni di stato necessarie e i collegamenti agli oggetti secondo necessità.

CGAffineTransform translate = CGAffineTransformMakeTranslation(self.webView.frame.origin.x,self.webView.frame.origin.y - self.webView.frame.size.height * 0.25); 
CGAffineTransform scale = CGAffineTransformMakeScale(0.6, 0.6); 
CGAffineTransform transform = CGAffineTransformConcat(translate, scale); 
transform = CGAffineTransformRotate(transform, degreesToRadians(-10)); 

// animation using block code 
[UIView animateWithDuration:2.0 
         delay:0.0 
        options:UIViewAnimationOptionCurveEaseIn 
       animations:^{ 
        screenShotView.transform = transform; 
       }completion:^(BOOL finished){ 
        // do something if needed 
       }]; 
Problemi correlati