如何用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
相关产品推荐
相关产品推荐

