让我们说,我有3个视图控制器:A
,B
,C
,全部嵌入到导航控制器中。 A
和B
有一个导航栏,C
没有。
我在B
和C
之间进行了自定义互动转换。由于我需要导航栏在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
的正确位置是什么?
答案 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
的模态全屏演示,但在我的情况下,我正在使用已经损坏导航层次结构的项目,我没有时间正确修复它。基本上,这就是我遇到这个问题的原因。