如何准确判断UISplitViewController何时显示主视图?
统一判断UISplitViewController当前可见视图的适配方案
针对iPhone和iPad上UISplitViewController的显示状态判断差异,这里提供两种可靠的解决思路:
方法一:根据设备状态分别判断
利用iPad非折叠状态下的displayMode属性,结合iPhone折叠状态下主视图的模态呈现特性,统一判断逻辑:
// 判断主视图(侧边栏)是否处于可见状态 func isPrimaryVisible(in splitView: UISplitViewController) -> Bool { // iPad非折叠场景:直接用displayMode判断 if !splitView.isCollapsed { return splitView.displayMode != .secondaryOnly } // iPhone折叠场景:主视图是通过模态弹出的,判断是否正在呈现 return splitView.presentedViewController === splitView.viewControllers.first }
原理:iPhone上UISplitViewController始终处于折叠状态,主视图的显示/隐藏是通过模态呈现/ dismiss实现的,因此通过presentedViewController是否等于主视图控制器,就能判断当前是否显示侧边栏。
方法二:自行维护显示状态(更稳定)
既然是手动控制侧边栏的切换按钮,直接维护一个本地状态变量,配合系统的show(_:sender:)和hide(_:sender:)方法使用,完全规避系统属性的差异问题:
private var isPrimaryShowing = false @IBAction func toggleSidebarButtonTapped(_ sender: UIButton) { isPrimaryShowing.toggle() guard let splitVC = splitViewController, let primaryVC = splitVC.viewControllers.first else { return } if isPrimaryShowing { splitVC.show(primaryVC, sender: self) } else { splitVC.hide(primaryVC, sender: self) } }
如果需要响应系统触发的状态变化(比如iPad旋转、分屏调整),可以监听通知同步状态:
override func viewDidLoad() { super.viewDidLoad() // 监听分屏显示模式变化通知 NotificationCenter.default.addObserver( self, selector: #selector(updateSidebarState), name: UISplitViewController.displayModeDidChangeNotification, object: splitViewController ) } @objc private func updateSidebarState() { guard let splitView = splitViewController else { return } // 仅在iPad非折叠场景下同步系统状态 if !splitView.isCollapsed { isPrimaryShowing = splitView.displayMode != .secondaryOnly } }
内容的提问来源于stack exchange,提问作者Antifonic
相关产品推荐
相关产品推荐

