在推送细节导航的同时设置UISplitViewController的preferredDisplayMode

时间:2016-10-11 10:40:13

标签: ios swift animation uinavigationcontroller uisplitviewcontroller

我有一个标准的UISplitViewController,在主窗格和详细窗格中都有导航控制器。大多数情况下,拆分视图控制器将preferredDisplayMode设置为.allVisible,以便主视图和详细信息都可见。

当我将特定视图控制器推送到详细导航堆栈时,我想隐藏主窗格,以便用户拥有更多的“全屏”视图。为了实现这一点,我尝试将详细视图控制器的preferredDisplayMode中的.primaryHidden更改为viewWillAppear,并将其更改回viewWillDisappear。但是,这会导致非常糟糕的动画,并且在转换结束时放置错误的视图。

Incorrect animation

我不确定如何解决这个问题。我已经尝试在不同的时间更改显示模式,调用将preferredDisplayMode更改为动画块(尽管它无论如何都是隐式动画),并要求视图控制器的视图自行恢复。它在动画块中看起来好一点,并且视图最终正确放置,但动画仍然有点怪异和跳跃。

那么,如何修复动画并实现我正在寻找的外观?

我整理了一个minimal sample project来证明这个问题。只需单击详细视图控制器中的“推送”按钮,即可显示重新配置拆分视图控制器的视图控制器。

1 个答案:

答案 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。我通常使用委托在视图控制器之间传递数据,并在那里设置显示模式。希望有所帮助。