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

如何用iOS14+ UISplitViewController实现竖屏主从视图并排及自定义侧边栏按钮

报错原因说明

UISplitViewControllerStyleUnspecified 仅适用于 Interface Builder 初始化场景,代码初始化时不允许传入该参数,因此会触发API误用的运行时错误,该方案不可行。

以下是两个需求的实现方案:

1. 竖屏始终保持主从视图并排展示

通过以下配置禁止系统自动折叠主视图:

let splitViewController = UISplitViewController(style: .doubleColumn)
splitViewController.preferredDisplayMode = .oneBesideSecondary
// 配置分栏行为为始终平铺,不折叠
splitViewController.preferredSplitBehavior = .tile
// 按需设置主视图的宽区间,确保竖屏时也有足够空间展示主视图
splitViewController.minimumPrimaryColumnWidth = 200
splitViewController.maximumPrimaryColumnWidth = 320

// 适配iOS14+ 补充代理逻辑避免折叠
extension CustomSplitViewController: UISplitViewControllerDelegate {
    func splitViewController(_ svc: UISplitViewController, shouldHide vc: UIViewController, in orientation: UIInterfaceOrientation) -> Bool {
        // 主视图在任何方向下都不自动隐藏
        guard let _ = svc.viewController(for: .primary) as? PrimaryViewController else {
            return true
        }
        return false
    }
}

配置后竖屏场景不会触发主视图折叠,也不会自动出现系统返回按钮。


2. 横屏场景自定义侧边栏控制按钮

移除系统默认侧边栏按钮

在 SecondaryViewController 的 viewDidLoad 中添加如下配置:

override func viewDidLoad() {
    super.viewDidLoad()
    // 禁止系统自动注入侧边栏控制按钮
    navigationItem.leftBarButtonItem = nil
    navigationItem.hidesBackButton = true
    // 关闭系统默认侧滑呼出侧边栏手势(可选,按需开启)
    splitViewController?.presentsWithGesture = false
}

添加自定义控制逻辑

给 SecondaryViewController 导航栏添加自定义按钮,点击时切换分栏展示模式:

// 绑定到自定义按钮的点击事件
@objc private func toggleSidebar() {
    guard let splitVC = splitViewController else { return }
    splitVC.preferredDisplayMode = splitVC.displayMode == .oneBesideSecondary ? .secondaryOnly : .oneBesideSecondary
    // 添加动画效果更顺滑
    UIView.animate(withDuration: 0.3) {
        splitVC.view.layoutIfNeeded()
    }
}

内容的提问来源于stack exchange,提问作者Niklas

相关产品推荐
方舟 Agent Plan

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

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