我有一个标准的UISplitViewController
,在主窗格和详细窗格中都有导航控制器。大多数情况下,拆分视图控制器将preferredDisplayMode
设置为.allVisible
,以便主视图和详细信息都可见。
当我将特定视图控制器推送到详细导航堆栈时,我想隐藏主窗格,以便用户拥有更多的“全屏”视图。为了实现这一点,我尝试将详细视图控制器的preferredDisplayMode
中的.primaryHidden
更改为viewWillAppear
,并将其更改回viewWillDisappear
。但是,这会导致非常糟糕的动画,并且在转换结束时放置错误的视图。
我不确定如何解决这个问题。我已经尝试在不同的时间更改显示模式,调用将preferredDisplayMode
更改为动画块(尽管它无论如何都是隐式动画),并要求视图控制器的视图自行恢复。它在动画块中看起来好一点,并且视图最终正确放置,但动画仍然有点怪异和跳跃。
那么,如何修复动画并实现我正在寻找的外观?
我整理了一个minimal sample project来证明这个问题。只需单击详细视图控制器中的“推送”按钮,即可显示重新配置拆分视图控制器的视图控制器。
答案 0 :(得分:0)
尝试在DetailViewController中使用prepareForSegue
。这将更改.preferredDisplayStyle
之前的UISplitViewController
呈现FullscreenViewController,动画更流畅。
在故事板中,从'推送'中选择show segue。按钮到FullscreenViewController并设置它的标识符(我总是使用目标ViewController的名称。)然后在DetailViewController中:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "FullscreenViewController" {
self.splitViewController?.preferredDisplayMode = .primaryHidden
}
}
在导航时快速修复'返回'到DetailViewController,我添加了
self.splitViewController?.preferredDisplayMode = .allVisible
在DetailViewController中到viewWillAppear
。我通常使用委托在视图控制器之间传递数据,并在那里设置显示模式。希望有所帮助。