2014-05-18 11 views
8

Ho un UITextView di sola lettura e sto aggiornando il testo. Quando viene visualizzato il nuovo testo, lo desidero animare come segue: Il nuovo testo scorre da destra, mentre il vecchio testo scorre fuori dallo schermo verso il lato sinistro.UIView transitionWithView Modifica delle proprietà di animazione: scorrere da destra?

È possibile farlo con transitionWithView? In caso contrario, qual è il modo migliore per farlo? Posso fargli fare un CrossDissolve, ma non è l'animazione che sto cercando:

[UIView transitionWithView:self.storyTextView 
        duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        [self.storyTextView setText:withStory.storyText]; 
       } 
       completion:nil]; 

La ragione per insistere sul diritto di animazione sinistra è perché alla fine io voglio che l'utente sia in grado di innescare facendo scorrendo verso sinistra su UITextView.

risposta

26

CATransition vi permetterà di fare questo, con un tipo di transizione di 'push' e un sottotipo di 'da destra'. E 'molto semplice da usare:

CATransition *transition = [CATransition new]; 
transition.type = kCATransitionPush; 
transition.subtype = kCATransitionFromRight; 

// Make any view changes 
self.textView.text = newText; 

// Add the transition 
[self.textView.layer addAnimation:transition forKey:@"transition"]; 

Si noti che questo, mentre è quello che hai chiesto, non si adatta bene con un gesto senza qualche ritocchi in più - per legarlo a un gesto avresti bisogno di fai qualcosa come impostare la velocità del livello su 0 e aggiornare manualmente l'avanzamento dell'animazione in modo che corrisponda al tuo gesto.

+0

@jrturton Se lo uso su imageView di una cella, funziona perfettamente finché non viene riutilizzato.Quindi ottieni la vecchia immagine della cella riutilizzata che passa alla nuova immagine. Voglio sempre che vada da vuoto a immagine. Senza l'animazione, tutto ciò che vorresti è l'immagine di imageView in readyForReuse, ma non è sufficiente per resettarlo. Eventuali suggerimenti? –

+0

@AlexanderofNorway che suona come un caso d'uso abbastanza diverso per meritare la sua stessa domanda - Sono sorpreso di impostare l'immagine su zero non funziona – jrturton

+0

Il problema con questa soluzione è che include una dissolvenza. – malhal

1

Che ne dici di utilizzare UIView animateWithDuration e far scorrere quello textView a destra mentre si scorre un nuovo textView da sinistra. Ecco un esempio, dobbiamo solo elaborare le posizioni. Fammi sapere se questo è quello che stavi cercando di fare.

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    self.textView2.frame = CGRectMake(1000.0,self.textView1.frame.origin.y,self.textView2.frame.size.width,self.textView2.frame.size.height); 

} 
- (IBAction)animate:(id)sender { 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.textView1.frame = CGRectMake(-200.0,self.textView1.frame.origin.y,self.textView1.frame.size.width,self.textView1.frame.size.height); 

     [UIView animateWithDuration:0.5 animations:^{ 
      self.textView2.center = (CGPointMake(200, 200)); 
     }]; 
    }]; 

} 
+0

Potrebbe funzionare. L'utilizzo di due UITextViews aggiunge complessità che speravo di evitare, ma proverò questo se gli altri non funzionano. Grazie. – stone

1

È inoltre possibile provare qualcosa di simile.

È possibile creare un containerView per la visualizzazione del testo e quindi modificare le coordinate utilizzando le animazioni UIView per assegnargli una diapositiva da destra a sinistra.

Si prega di vedere il codice qui sotto.

Prima dichiarare una vista contenitore e fare in modo che il testo richiesto visualizzi la sottoview.

In .h

@property (strong, nonatomic)IBOutlet UIView *containerView; 
@property (strong, nonatomic)IBOutlet UITextView *childTextView; //I have set it as subview in xib 

In .m assicurarsi di impostare quanto segue in viewDidLoad o in Xib

self.containerView.clipsToBounds = YES; 

Gesti

UISwipeGestureRecognizer *recog = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(changeText)]; 
recog.direction = UISwipeGestureRecognizerDirectionLeft; 
[self.containerView addGestureRecognizer:recog]; 

abbellimento (per questo si avrebbe bisogno QuartzCore/QuartzCore.h)

self.containerView.layer.borderWidth = 1.0f; 
self.containerView.layer.borderColor = [UIColor lightGrayColor].CGColor; 
self.containerView.layer.cornerRadius = 5.0f; 

Dritti al punto

- (void)changeText 
{ 
    [UIView animateWithDuration:0.3f animations:^(void){ 
     CGRect endPos = self.childTextView.frame; 
     endPos.origin.x -= endPos.size.width; //Move it out of the view's frame to the left 
     self.childTextView.frame = endPos; 
    } completion:^(BOOL done){ 
     CGRect startPos = self.childTextView.frame; 
     startPos.origin.x += (2*startPos.size.width);// this will take it to the right. 
     self.childTextView.frame = startPos; 
     self.childTextView.text = @"Changed text"; 

     [UIView animateWithDuration:0.2f animations:^(void){ 
      CGRect displayPos = self.childTextView.frame; 
      displayPos.origin.x -= displayPos.size.width; // To compensate for the double +ve on top 
      self.childTextView.frame = displayPos; 
     }]; 
    }]; 
} 
+0

Ho utilizzato il codice di riconoscimento del gesto direttamente su UITextView e implementato il suggerimento CATransition di @ jrturton. Funziona bene anche se non puoi controllare la velocità dell'animazione muovendo il pollice più velocemente o più lentamente. Grazie. – stone

Problemi correlati