In my app, I have a page view controller that allows the user to swipe between different \"sections\" of the app, and at the top in the nav bar I change the title text to th
Found the best way is this category:
@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];
});
}