我试图使用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模式的变化?
答案 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:
这应该可以完全满足您的需求。