在 UISplitViewController 中仅隐藏 .supplementary 列

Hide only .supplementary column in UISplitViewController

我设置了 UISplitViewController 样式 .tripleColumn

let splitViewController = UISplitViewController(style: .tripleColumn)
preferredDisplayMode = .twoBesideSecondary
preferredSplitBehavior = .tile

第一个菜单项“我的故事”需要三列。但是,对于所有其他菜单项,它应该只是主列(侧边栏)并且内容可见。 .supplementary 列应该被隐藏。

例如,当单击“我的统计信息”时,以下代码会同时隐藏 .primary(边栏)和 .supplementary 列,并且仅显示“我的统计信息”。

splitViewController?.showDetailViewController(stats, sender: nil)
splitViewController?.hide(.supplementary)

如何切换到 .twoColumn 样式并且只显示 .primary.secondary 列?

.tripleColumn 拆分视图控制器中,根据设计,.primary 列不可能在不显示 .supplementary 列的情况下出现。

并且您不能将同一个拆分视图控制器从 .tripleColumn 更改为 .doubleColumn。我想您可以直接将整个拆分视图控制器从界面中剥离出来并替换为一个不同的视图控制器,但这真的是您想要做的吗?我认为按照设计使用的方式使用拆分视图控制器会更好。

我有类似的问题,但我的解决方案非常“hacky”。当我想隐藏它时,我只是将首选补充列宽度更改为 1。任何小于 1 的值都会导致应用冻结。

func toggleSupplementary(_ isOn: Bool) {
    viewController(for: .supplementary)?.view.alpha = isOn ? 1 : 0
    preferredSupplementaryColumnWidth = isOn ? UISplitViewController.automaticDimension : 1
}

您也可以尝试将辅助视图控制器设置为 nil。这样你就会达到你想要的。

splitViewController.setViewController(nil, for: .supplementary)

然而,当您的拆分视图控制器折叠到紧凑宽度然后再次展开时,这会导致崩溃。更改列宽的解决方案在这种情况下也适用。

解决方案非常简单,我讨厌浪费一天时间寻找它(甚至重新考虑我的整个应用程序设计)。

要隐藏补充栏,请将其视图设置为 nil。就这么简单。

splitViewController?.setViewController(nil, for: .supplementary)

当您再次需要它时:将其设置为合理的视图!

注意:当 supplementary 为 nil 时,显示侧边栏按钮会损坏。我决定取消像在音乐应用程序中一样隐藏侧边栏的可能性。为此,请删除“Present Master with Gesture”。