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