2014-07-03 14 views
12

In meiner App habe ich eine Seitenansicht Controller, der den Benutzer zwischen verschiedenen "Abschnitte" der App wischen kann, und an der Spitze in der Navigationsleiste ändere ich den Titel auf den neuen Text Abschnitt, zu dem der Benutzer über pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: geswiped hat. Es ändert momentan sofort den Titeltext, wenn die Animation abgeschlossen ist. Ich würde das gerne mit etwas Animation, einem subtilen Ein- und Ausblendeffekt, verbessern.Animieren Navigationsleiste Titel Text ändern

Ich versuchte zuerst [UIView animationWithDuration:...] zu implementieren, um das Ändern des Titeltextes zu animieren, aber es animiert nicht und aktualisiert einfach sofort.

Ich fragte mich dann, ob es möglich wäre, das Alpha des Navigationsleistentitels zu aktualisieren, wenn der Benutzer horizontal scrollt, je nachdem, wie weit er gescrollt hat, und 0 Alpha erreicht, wenn der nächste Abschnitt auf dem Bildschirm erscheint. dann kann ich sofort den Text ändern, während es bei 0 ist und dann schnell in 1 Alpha einblenden. Aber ich sehe keine Methode auf UIPageViewControllerDelegate, die aufgerufen wird, wenn die Bildlaufposition aktualisiert wurde.

Wenn möglich, anstatt nur ein- und auszublenden, konnte ich die Titeltextposition in der Navigationsleiste ebenso ausblenden und verschieben wie die Standardanimation, die beim Zurückgehen von einem Push-Schnitt über eine Wischgeste auftritt. Ich würde den alten Abschnitt Titel schieben, wie der Benutzer scrollt und den nächsten Abschnitt Titel auf der anderen Seite, so dass, wenn der Übergang den vorherigen Abschnitt Titel ist außerhalb des Bildschirms und der neue ist perfekt zentriert, so dass die Ersetzung abgeschlossen ist. Aber wiederum erfordert dies, genau zu wissen, wie viel der Benutzer den Seitenaufruf-Controller gescrollt hat.

Ist es möglich, eine der gewünschten Animationen zu implementieren?

+0

Haben Sie versucht, eine benutzerdefinierte Ansicht für Ihren Navigationstitel zu verwenden? self.navigationItem.titleView = customNavTitleLabel; – Zhang

+0

@ Zhang Ich habe nicht, ich werde das untersuchen. Gibt es eine Möglichkeit, das 'UILabel' aus dem bestehenden Titel zu holen, so dass ich den Standardtitel (der sich mit aktiviertem Fetttext ändert) aufnehmen kann, ihn ändern und auf den angepassten setzen kann? – Joey

+0

Ich denke, ich habe Leute gesehen, die eine verrückte rekursive Schleife benutzen, um die nav title subview zu finden: P kannst du ausprobieren, wenn du willst. – Zhang

Antwort

36

Wenn Sie zwischen verschiedenen Titel-Strings, verwenden Sie die folgende animieren möchten:

CATransition *fadeTextAnimation = [CATransition animation]; 
fadeTextAnimation.duration = 0.5; 
fadeTextAnimation.type = kCATransitionFade; 

[self.navigationController.navigationBar.layer addAnimation: fadeTextAnimation forKey: @"fadeText"]; 
self.navigationItem.title = "My new title"; 

Sie können einstellen, die Dauer und stellen eine Timing-Funktion anzupassen, natürlich .

Es gibt auch andere Arten von Animationen, die unter verschiedenen Umständen (dank @inorganik) funktionieren könnte:

kCATransitionFade 
kCATransitionMoveIn 
kCATransitionPush 
kCATransitionReveal 
+1

Liebe diese Lösung! Toller Trick, um meinen Ärmel hoch zu bekommen. – inorganik

+0

Und nur eine Anmerkung für Uneingeweihte, wenn meine Erfahrung definitiv ist, müssen Sie das QuartzCore-Framework über [Projekt]> [Ziel]> Build-Phasen> Link-Binaries> QuartzCore.framework hinzufügen. –

2

Eine Lösung besteht darin, einen benutzerdefinierten Titel zu erstellen und seine Position zu animieren, indem Sie die delegierte Methode scrollView des Seitenaufruf-Controllers verwenden. Wie Zhang erwähnt, ist der Brauch Titel einfach self.navigationItem.titleView = customNavTitleLabel;

0

Gefunden der beste Weg ist, diese Kategorie:

@implementation UIViewController (ControllerNavigationEffects) 

-(void) setNavigationTitleWithAnimation:(NSString *) title { 
    if ([self.navigationItem.title isEqualToString:title]) { 
     return; 
    } 
    @weakify(self); 
    float duration = 0.2; 
    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
     @strongify(self); 
     self.navigationItem.titleView.alpha = 0; 
    } completion:^(BOOL finished) {}]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     @strongify(self); 
     self.navigationItem.titleView = nil; 
     self.navigationItem.title = title; 

     [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      self.navigationItem.titleView.alpha = 1; 
     } completion:nil]; 
    }); 
} 

-(void) setNavigationTitleViewWithAnimation:(UIView *) titleView { 
    if ([self.navigationItem.titleView isKindOfClass:[titleView class]]) { 
     return; 
    } 
    @weakify(self); 
    float duration = 0.2; 

    CATransition *fadeTextAnimation = [CATransition animation]; 
    fadeTextAnimation.duration = duration; 
    fadeTextAnimation.type = kCATransitionFade; 

    [self.navigationController.navigationBar.layer addAnimation: fadeTextAnimation forKey: @"fadeText"]; 
    self.navigationItem.title = @""; 


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     @strongify(self); 
     self.navigationItem.title = @""; 
     self.navigationItem.titleView = titleView; 

     [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      self.navigationItem.titleView.alpha = 1; 
     } completion:nil]; 

    }); 
} 
27

Für Bequemlichkeit, Ashley Mills Lösung in Swift:

11/16/2016 Aktualisiert für Swift 3 (Danke an n13)

let fadeTextAnimation = CATransition() 
fadeTextAnimation.duration = 0.5 
fadeTextAnimation.type = kCATransitionFade 

navigationController?.navigationBar.layer.add(fadeTextAnimat‌​ion, forKey: "fadeText") 
navigationItem.title = "test 123" 

Swift 2.x

let fadeTextAnimation = CATransition() 
fadeTextAnimation.duration = 0.5 
fadeTextAnimation.type = kCATransitionFade 

navigationController?.navigationBar.layer.addAnimation(fadeTextAnimation, forKey: "fadeText") 
navigationItem.title = "test 123" 

ich meinen Hut zu Ashley Spitze!

+1

Swift 3 navigationController? .navigationBar.layer.add (fadeTextAnimation, forKey: "fadeText") – n13

+0

@ n13 Danke für die Erinnerung :) –

+1

Bemerkte die Dokumente auf der 'type' Eigenschaft. "Der Name des Übergangs. Aktuelle legale Übergangstypen sind Fade, moveIn, push und layer. Die Standardwerte werden ausgeblendet", so dass die 'type'-Eigenschaft nicht benötigt wird. –

Verwandte Themen