【问题标题】:How to disable navigationBar animation?如何禁用导航栏动画?
【发布时间】:2012-01-03 19:43:56
【问题描述】:

我有两个 UITableViewController,因此当我在第一个 UITableViewController 上单击下一步时,第二个 UITableViewController 会被推送到导航堆栈上并像正常一样为过渡设置动画。我想这样做,所以当我按下下一步时,只有视图动画,而导航栏没有(保持不变)。我已经非常接近使用下面的代码做到这一点:

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

    CATransition *navTransition = [CATransition animation];
    navTransition.duration = .5;
    navTransition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    navTransition.type = kCATransitionPush;
    navTransition.subtype = kCATransitionPush;
    [self.navigationController.navigationBar.layer addAnimation:navTransition forKey:nil];

}

我放了这段代码,我也做了它,所以两个导航栏上的标题和按钮在每个 UITableViewController 中都是完全相同的。它几乎可以工作,问题是,动画发生时导航栏会闪烁。有没有办法让它不闪烁,或者有没有其他好的方法来防止导航栏的动画发生(即禁用图层上的动画或其他东西)?

更新:有人有其他想法吗?仍在为此苦苦挣扎。

【问题讨论】:

    标签: ios objective-c xcode uinavigationbar navigationbar


    【解决方案1】:

    这就是我想出的。下面是序列中第一个 viewController 的代码:

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
            if (viewController == self)
            {
                    if (self.isInitialized)
                    {
                            CATransition *navigationBarAnimation = [CATransition animation];
                            navigationBarAnimation.duration = 1.5;
                            navigationBarAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];;
                            navigationBarAnimation.type = kCATransitionFade;
                            navigationBarAnimation.subtype = kCATransitionFade;
                            navigationBarAnimation.removedOnCompletion = YES;
                            [self.navigationController.navigationBar.layer addAnimation:navigationBarAnimation forKey:nil];
                    }
                    else 
                    {
                            self.isInitialized = YES;
                    }
            }
    }
    
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
            if (viewController == self)
            {
                    if (self.isInitialized)
                    {
                            [self.navigationController.navigationBar.layer removeAllAnimations];
                    }
            }
    }
    

    这是第二个视图控制器的代码:

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
            if (viewController == self)
            {
                    if (!self.isInitialized)
                    {
                            CATransition *navigationBarAnimation = [CATransition animation];
                            navigationBarAnimation.duration = 1.5;
                            navigationBarAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];;
                            navigationBarAnimation.type = kCATransitionFade;
                            navigationBarAnimation.subtype = kCATransitionFade;
                            navigationBarAnimation.removedOnCompletion = YES;
                            [self.navigationController.navigationBar.layer addAnimation:navigationBarAnimation forKey:nil];
                            self.isInitialized = YES;
                    }
            }
    }
    
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
            if (viewController == self)
            {
                    if (self.isInitialized)
                    {
                            [self.navigationController.navigationBar.layer removeAllAnimations];
                    }
            }
    }
    

    您必须使用UINavigationController 委托方法来确定何时显示UIViewController。然后对于每个UIViewController,需要创建一个BOOLisInitialized 属性,这样它可以帮助您确定UIViewController 何时被推入堆栈,或者它何时被显示,因为您推回了下一个UIViewController .

    【讨论】:

    • 我在 viewDidLoad 中使用动画代码,但我不确定何时、何地以及是否应该使用 removeAllAnimations,您还有什么要制作的 cmets 吗?提前致谢。
    • @Jules - 我用更多细节更新了答案。试试这个,让我知道它是怎么回事。那里应该一切正常,但我前段时间做过,所以请告诉我。
    • 子类 UINavigationBar 并覆盖 popNavigationItemAnimated petersimpson.me/blog/static-nav-bar
    【解决方案2】:

    这可能不是最佳答案/想法,但您可以在动画期间屏蔽 UINavigationBar。

    创建一个看起来与您当前的UNavigationBar 完全相同的UINavigationBar,在过渡发生之前将其添加到keyWindow,然后在完成后将其删除。这将基本上只覆盖UINavigationBar 并隐藏其动画。

    【讨论】:

    • 如果我无法找到其他工作方式,很酷的想法会尝试一下
    【解决方案3】:

    斯威夫特

    这是快速解决方案

    var isInitialized = false
    

    你的 FirstViewController:

    func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
            if viewController == self {
                if self.isInitialized {
                    var navigationBarAnimation = CATransition()
                    navigationBarAnimation.duration = 1.5
                    navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
                    navigationBarAnimation.type = kCATransitionFade
                    navigationBarAnimation.subtype = kCATransitionFade
                    navigationBarAnimation.removedOnCompletion = true
                    self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil)
                    }
                    else 
                    {
                            self.isInitialized = true;
                    }
            }
    }
    
    func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
            if viewController == self {
                if self.isInitialized {
                    self.navigationController?.navigationBar?.layer?.removeAllAnimations()
                }
            }
    }
    

    你的 SecondViewController:

    func navigationController(_ navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
            if viewController == self {
                if !self.isInitialized {
                    var navigationBarAnimation = CATransition()
                    navigationBarAnimation.duration = 1.5
                    navigationBarAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
                    navigationBarAnimation.type = kCATransitionFade
                    navigationBarAnimation.subtype = kCATransitionFade
                    navigationBarAnimation.removedOnCompletion = true
                    self.navigationController?.navigationBar?.layer?.addAnimation(navigationBarAnimation, forKey: nil)
                            self.isInitialized = true;
                    }
            }
    }
    
    func navigationController(_ navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
            if viewController == self {
                if self.isInitialized {
                    self.navigationController?.navigationBar?.layer?.removeAllAnimations()
                }
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多