【问题标题】:Setting UISplitViewController's preferredDisplayMode whilst pushing onto detail navigation在推入详细导航时设置 UISplitViewController preferredDisplayMode
【发布时间】:2017-02-19 21:21:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios swift animation uinavigationcontroller uisplitviewcontroller


    【解决方案1】:

    尝试在 DetailViewController 中使用prepareForSegue。这将改变你的UISplitViewController.preferredDisplayStyle 之前 呈现 FullscreenViewController,动画更流畅。

    在情节提要中,选择从“push”按钮到 FullscreenViewController 的 show segue 并设置它的标识符(我总是使用目标 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。我通常使用委托在视图控制器之间传递数据,并在那里设置显示模式。希望对您有所帮助。

    【讨论】:

    • 我正在使用类似的方法(实际上,我将self.splitViewController?.preferredDisplayMode = .allVisible 放置在我正在全屏呈现的 viewController 的 viewWillDisappear 中,但我已经在 viewWillAppear 中测试了您的方法并且效果相同)。我的问题是,在从“全屏”视图返回的过渡结束时,原始海报的 detailView 控制器的宽度错误仍然存​​在问题:在我的情况下,详细信息中的 tableView 似乎太大而部分在我滚动之前,这些单元格都在屏幕外,然后 tableView “适应”了它的大小。有什么想法可以解决这个问题吗?
    • 因此,我找到了解决我在之前评论中解释的问题的方法:使用 VC 中的自定义后退按钮,我正在呈现“全屏”,我可以拨打 self.splitViewController?.preferredDisplayMode = .allVisibleself.navigationController?.popViewController(animated: true) 之前,这解决了在全屏关闭完成后detailVC 的宽度不正确。
    猜你喜欢
    • 2015-02-21
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多