Animate nav bar title text change

前端 未结 5 1740
孤独总比滥情好
孤独总比滥情好 2020-12-08 16:51

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

5条回答
  •  爱一瞬间的悲伤
    2020-12-08 17:29

    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];
    
        });
    }
    

提交回复
热议问题