交互式转换:导航栏外观问题

时间:2017-07-03 19:15:47

标签: ios iphone swift uinavigationcontroller uinavigationbar

让我们说,我有3个视图控制器:ABC,全部嵌入到导航控制器中。 AB有一个导航栏,C没有。

我在BC之间进行了自定义互动转换。由于我需要导航栏在C上消失,因此我实现了UINavigationControllerDelegate的此功能:

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if viewController is C {
        navigationController.setNavigationBarHidden(true, animated: animated)
    }
    else {
        navigationController.setNavigationBarHidden(false, animated: animated)
    }
}

当我只进行推 - 弹过渡时,一切都在常见的场景中完美运行。

但是当我<{1}}上的B调用取消过渡C - &gt; cancel()时,导航栏不会显示在UIPercentDrivenInteractiveTransition上。在这里,我必须致电B,但我没有设法找到正确的地方。

如果我在setNavigationBarHidden(false, ...)的{​​{1}}中调用它,会出现导航栏,但看起来很奇怪 - 它包含B如果有导航栏会有的元素。如果我回到viewWillAppear,它会在预期内容中闪烁一会儿,但在转换后,C导航栏会被A导航栏取代!

因此,似乎导航条堆栈在A - &gt; B转换取消后以某种方式被破坏,它似乎相对于像这样的视图控制器移位:

B

所以,我的问题是在这种情况下调用C的正确位置是什么?

1 个答案:

答案 0 :(得分:2)

好吧,我已经设法找到一个丑陋的黑客来自己解决它。也许这个世界上有人会发现它有用。

  • 在我的自定义UIPercentDrivenInteractiveTransition中,我重写了cancel这样的功能:

    class CustomTransitionManager: UIPercentDrivenInteractiveTransition {
    
        /// Indicates transition direction. Must be set before each transition.
        var forward: Bool = true
    
        /// Current navigation controller used for transition. Must be set before transition starts
        var nc: UINavigationController?
    
        /**
         * Hack #1 with UINavigationController here
         */
        override func cancel() {
            super.cancel()
    
            if forward {
                self.nc?.setNavigationBarHidden(false, animated: false)
            }
            self.nc?.setNavigationBarHidden(forward, animated: false)
        }
    }
    
  • 在每个视图控制器(A,B,C)中,我做了以下黑客攻击:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        // Hide and immediately show navigation bar: this will restore it's correct state
        self.navigationController?.setNavigationBarHidden(true, animated: false)
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }
    

最佳解决方案可能是C的模态全屏演示,但在我的情况下,我正在使用已经损坏导航层次结构的项目,我没有时间正确修复它。基本上,这就是我遇到这个问题的原因。