animation导航栏标题文本更改

在我的应用程序中,我有一个页面视图控制器,允许用户在应用程序的不同“部分”之间滑动,并在导航栏的顶部将标题文本更改为用户通过pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:滑动到的新部分pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: 目前,animation完成后,立即更改标题文本。 我想用一些animation来改善它,一种微妙的淡入淡出效果。

我首先试图实现[UIView animationWithDuration:...]animation改变标题文本,但它不animation,只是仍然立即更新。

然后,我想知道是否有可能更新导航栏标题的alpha,因为用户基于滚动的距离而水平滚动,当下一个部分即将进入屏幕时达到0 alpha,那么我可以立即在0时更改文本,然后快速淡入1 alpha。 但是当滚动位置已经更新时,我没有在UIPageViewControllerDelegate上看到一个方法。

如果可能,而不是淡入淡出,我可以淡入淡出以及在导航栏中移动标题文本位置,就像从通过滑动手势从推播返回导航时发生的默认animation一样。 当用户滚动时,我会滑动旧节标题,并在另一侧提供下一节标题,以便在转换完成时,前一节标题离开屏幕,并且新节点完全居中以便replace完成。 但是,这又需要知道用户究竟有多less滚动页面视图控制器。

是否有可能实现任何所需的animation?

如果要在不同的标题string之间进行animation制作,请使用以下命令:

 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"; 

当然,您可以调整持续时间并设置一个计时function。

还有其他types的animation,可能在不同情况下工作(感谢@无机):

 kCATransitionFade kCATransitionMoveIn kCATransitionPush kCATransitionReveal 

为方便起见,Swift中的Ashley Mills解决scheme:

11/16/2016更新了Swift 3(感谢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" 

我把我的帽子给阿什利!

一个解决scheme是创build一个自定义标题,并使用页面视图控制器的隐藏的scrollView的委托方法来animation它的位置。 正如张先生所说,自定义标题只是self.navigationItem.titleView = customNavTitleLabel;

find最好的办法就是这个类别:

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