如何解决UISplitViewController-在iPad Portrait中展开和折叠主视图
我的通用应用通过preferredDisplayMode = .allVisible
在iPad中同时显示主视图和详细视图。我需要将主视图扩展到全屏,并在单击按钮时隐藏细节视图。我知道有功能可以将详细信息扩展到全屏隐藏母版。但是找不到如何展开和折叠主视图。
我尝试了如下扩展功能。
self.splitViewController.preferredPrimaryColumnWidthFraction = 1.0
self.splitViewController.maximumPrimaryColumnWidth = self.splitViewController.view.bounds.size.width as! CGFloat
折叠功能如下。
self.splitViewController.preferredDisplayMode = .allVisible
self.splitViewController.preferredPrimaryColumnWidthFraction = 0.6
self.splitViewController.maximumPrimaryColumnWidth = self.splitViewController.view.bounds.size.width as! CGFloat
但是它们不起作用。关于如何实现这一目标的任何想法?
解决方法
我的设置使用导航栏,但如果没有它,则显示/隐藏功能可能会起作用。我想要实现的是让用户决定是否显示“主要”视图,并且无论方向如何,都显示它-UISplitViewController
本身不具备这种功能。>
我通过激活/停用两个约束数组,将次要“视图”的前导锚固定到“主要”尾随锚上实现了此目标。所有约束更改都在“主要”视图中进行。
(我使用引号是因为这些视图实际上具有UIView
应该具有的更多逻辑,因此它们分别是UIViewControllers
,一个是另一个的子代,但是约束是与视图相关。)
让我们从静态约束开始:
primary.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
primary.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
primary.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
secondary.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
secondary.leadingAnchor.constraint(equalTo: toolBar.trailingAnchor).isActive = true
secondaary.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
secondary.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
接下来,定义/填充将显示/隐藏主数组的两个数组:
var isShowingPrimary = false
var showPrimary = [NSLayoutConstraint]()
var hidePrimary = [NSLayoutConstraint]()
showPrimary.append(primary.widthAnchor.constraint(equalToConstant: 300))
hidePrimary.append(primary.widthAnchor.constraint(equalToConstant: 0))
NSLayoutConstraint.activate(hidePrimary)
请注意,isActive
对于静态约束是正确的,而我仅激活了hidePrimary
约束。
现在您需要做的就是连接UIBarButtonItem
或UIButton
来执行一个切换功能,该功能将显示/隐藏主视图以及对其进行动画处理:
func togglePrimary() {
if isShowingPrimary {
// hide primary view
NSLayoutConstraint.deactivate(showPrimary)
NSLayoutConstraint.activate(hidePrimary)
} else {
// show primary view
NSLayoutConstraint.deactivate(hidePrimary)
NSLayoutConstraint.activate(showPrimary)
}
// toggle flag and animate changes
isShowingPrimary.toggle()
UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。