You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何准确判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:04:54