6

有没有什么方法可以在不同barTintColor的推送控制器上使用平滑的颜色过渡动画UINavigationControllerUINavigationBar

我希望在'push/pop 动画UINavigationBar期间有 ' tint color的平滑动画,理想情况下还有交互式弹出(基于手势的控制器弹出)。UINavigationController

为什么我需要这个?我想在导航堆栈中有 1 个控制器具有不同的色调颜色来指示某些任务的状态(红色/绿色等)。

到目前为止我已经尝试过:

  • viewWillAppear(查看生命周期) 方法,但没有办法为barTintColor(like setBarTintColor:animated:)设置动画
  • 改变块barTintColor[UIView animation...]但这只是奇怪地动画(可能)一些背景层的框架,而不是平滑的颜色过渡。
  • barTintColor用改变[UIView transitionWithView:...]UIViewAnimationOptionTransitionCrossDissolve,但这不会动画变化。动画持续时间后立即更改为新的色调颜色
  • 我有一个想法,在进度期间实现新的 iOS 7 自定义过渡计算和更改导航栏的颜色,但这似乎是大材小用(特别是如果我想在任何地方保持原始动画外观)

谢谢大家的任何想法和答案

4

1 回答 1

26

您可以使用UIViewControllerTransitionCoordinator.

  1. 将示例代码复制到AController并自定义颜色。
  2. 将示例代码复制到BController并自定义颜色。
  3. 而已!在UINavigationController' 推送/弹出转换期间,AController' 样式将平滑淡入/淡出到BController' 样式。

示例代码:

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    [[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        self.navigationController.navigationBar.translucent = NO;
        self.navigationController.navigationBar.barStyle = UIBarStyleDefault;

        // text color
        [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];

        // navigation items and bar button items color
        self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

        // background color
        self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
    } completion:nil];
}
于 2014-04-25T19:57:12.627 回答