检测UISplitViewController何时更改显示模式

时间:2018-05-04 21:39:04

标签: ios uisplitviewcontroller

我试图使用UISplitViewController,其中辅助控制器应该公开"关闭"每当UISplitViewController处于并排模式时,功能(通过按钮或按钮栏项),但应在其他时间隐藏该功能。我尝试将它放在辅助视图控制器中:

override func viewWillAppear(_ animated: Bool) {
    if splitViewController!.primaryHidden {
        // hide the "close" UI artifact
    } else {
        // show the "close" UI artifact
    }
}

这正确地设置了"关闭"的可见性。在第一次显示辅助视图时起作用,但如果UISplitViewController在展开和折叠之间切换(例如,通过旋转iPhone 6s Plus),则不再调用此函数(这是有意义的,因为辅助控制器仍然可见)。因此,"关闭"函数保持其初始状态 - 隐藏或显示 - 即使UISplitViewController更改模式。

我怎样才能得到"关闭"函数隐藏或显示以响应UISplitViewController模式的变化?

3 个答案:

答案 0 :(得分:0)

好的,我找到了一个简单的解决方案。我犯了一个新手的错误。诀窍是覆盖viewWillLayoutSubviews()而不是viewWillAppear(animated:)。然后一切都按我的意愿运作。每次包含viewWillLayoutSubviews()更改其显示模式时,似乎UISplitViewController被调用(有时不止一次),这正是我需要响应的内容。唯一的问题是splitViewController在某些调用中可能是nil,因此需要像这样实现:

override func viewWillAppear(_ animated: Bool) {
    if let svc = splitViewController {
        if svc.primaryHidden {
            // hide the "close" UI artifact
        } else {
            // show the "close" UI artifact
        }
    }
}

作为寻找解决方案的绊脚石的一部分,我尝试重写traitCollectionDidChange(previousTraitCollection:)。 (我试过这个因为我想对设备轮换作出反应。)起初我以为我是在做某事,因为只要设备旋转,这个函数也会被调用。有趣的是(并且令人沮丧地),当调用此函数时,我发现我的splitViewController属性nil属性为viewDidDisappear(animated:)。这应该是这样似乎很奇怪,因为当UISplitViewController重新配置自身时,不会调用viewWillAppear(animated:)nil。但是,为什么它应该是{{1}},我想,这是另一天的问题。

答案 1 :(得分:0)

or通知:

UIViewControllerShowDetailTargetDidChangeNotification

用法如下

// Sometimes view controllers that are using showViewController:sender and
// showDetailViewController:sender: will need to know when the split view
// controller environment above it has changed. This notification will be 
// posted when that happens (for example, when a split view controller is
// collapsing or expanding). The NSNotification's object will be the view
// controller that caused the change.
UIKIT_EXTERN NSNotificationName const UIViewControllerShowDetailTargetDidChangeNotification NS_AVAILABLE_IOS(8_0);

答案 2 :(得分:0)

供以后参考:

如何使用 UISplitViewControllerDelegate

它有一个称为

的方法
splitViewController:willChangeToDisplayMode:

这应该可以完全满足您的需求。

Documentation here