2011-10-07 19 views
6

Volevo ruotare un UIView sul suo asse orizzontale per 360 gradi e quindi aggiornare il contenuto nella vista. Stavo cercando soluzioni su questo. Ho trovato una coppia qui e là. Questo è quello con cui sono uscito.Ruota un UIView sul relativo asse X (asse orizzontale)

[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
     self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0); 
    } completion:^(BOOL finished){ 
     NSLog(@"Finished first pi"); 
     [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
      self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0); 
     } completion:^(BOOL finished) { 
      NSLog(@"Finished second pi"); 

     }];   

    }]; 

Questo inverte la vista ma solo di 180 gradi. Voglio girarlo ancora una volta in modo che possa vedere normalmente la vista.

Entrambi i miei NSLogs vengono visualizzati uno dopo l'altro. Sono sicuro che mi manca qualcosa qui. Qualsiasi aiuto sarebbe utile ..

Grazie

risposta

8

Nel blocco di completamento prova a concatenare la nuova trasformazione con la trasformazione corrente.

self.tableView.layer.transform = CATransform3DConcat(self.tableView.layer.transform, CATransform3DMakeRotation(M_PI,1.0,0.0,0.0)); 
+1

Non è necessario impostare la 'transform' sul' CALayer' direttamente in questo caso, si può semplicemente impostare il 'transform' sul' UIView', anche se è un diverso tipo 'struct' - un' CGAffineTransform'. –

+0

Questo è corretto. Volevo solo fare un esempio. Io uso sempre la trasformazione su UIView. – jaminguy

1

Si dovrebbe controllare questa risposta How to make a CATransform3dMakeRotation rotate the other way? And chain together

Penso che il problema è in relazione con: "Quando si lavora con una trasformazione direttamente, Core Animation sarà interpolare la Trasforma dal valore corrente alla trasformazione specificata: troverà il percorso più breve per arrivare a quella trasformazione, che restringerà la direzione dell'animazione.Se provi ad animare due volte la stessa proprietà di trasformazione, il secondo valore sostituirà semplicemente il primo, non combinare le due trasformazioni insieme. "

1

uso questo: -

rotatingView.layer.anchorPoint = CGPointMake(0.0f, 0.0f); 
    rotatingView.center = CGPointMake(0, 
             (rotatingView.center.y - 
             (rotatingView.bounds.size.height/2.0f))); 
    rotatingView.center = CGPointMake(0, 
             (rotatingView.center.y- 
             (rotatingView.bounds.size.height/2))); 

// start the Page Open 
[UIView beginAnimations:@"Animation" context:nil]; 
[UIView setAnimationDuration:13.0]; 
// set angle as per requirement 
[rotatingView.layer setValue:[NSNumber numberWithInt:280] 
        forKeyPath:@"transform.rotation.x"]; 

[UIView commitAnimations]; 
0

Non vi resta che modificare il codice 1,0-0,0 all'interno blocco completamento e Woohoo tutto fatto.

[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
      self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,1.0,0.0,0.0); 
     } completion:^(BOOL finished){ 
      NSLog(@"Finished first pi"); 
      [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionTransitionNone animations:^{ 
       self.tableView.layer.transform = CATransform3DMakeRotation(M_PI,0.0,0.0,0.0); 
      } completion:^(BOOL finished) { 
       NSLog(@"Finished second pi"); 

      }];   

     }]; 
0

È inoltre possibile avvicinarsi a questo utilizzando il numero di ripetizioni e .Repeat.Autoreverse opzioni di animazione + impostazione di animazione. Ecco un esempio di Swift:

UIView.animateWithDuration(time, delay: 0, options: [.Repeat, .Autoreverse], animations: { 
     UIView.setAnimationRepeatCount(3) 
     self.view.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 1, 0, 0) 
    }) { (completed) in 
     // completion 
    }