iOS26适配-UISplitViewController配置分栏和分屏

背景

使用Xcode26打包出来的,iPad UISplitViewController布局错乱

配置属性

ini 复制代码
preferredSplitBehavior = .tile // 平铺
primaryBackgroundStyle = .none // none/sidebar 设置sidebar 侧边栏样式

presentsWithGesture = false // 禁用滑动手势隐藏主列,primary栏常驻
            
primaryEdge = .leading

preferredDisplayMode = .twoBesideSecondary // 平推过去 并排
preferredPrimaryColumnWidthFraction = 0.2 // 占比 20%
maximumPrimaryColumnWidth = .infinity
preferredSupplementaryColumnWidthFraction = 0.3 // 占比 30%
if #available(iOS 26.0, *) {
    preferredSecondaryColumnWidthFraction = 0.5 // 占比50%
    preferredInspectorColumnWidthFraction = 0.0 // 占比 0
}
  • 左右分屏

double布局

triple布局

iOS 26可以设置四层布局

案例-左右分屏

  • iOS 26.0 和 iOS 26.2以上使用不同 ColumnStyle

iOS 26.0 直接使用doubleColumn+oneBesideSecondary 会出遮挡问题

改为 tripleColumn + twoDisplaceSecondary+preferredSupplementaryColumnWidth=10

最终:

swift 复制代码
enum ColumnStyle {
        case doubleColumn
        case tripleColumn
        case unspecified
    }

    static var columnStyle: ColumnStyle {
        if #available(iOS 26.2, *) {
            return .doubleColumn
        } else if #available(iOS 26.0, *) {
            return .tripleColumn
        } else {
            return .unspecified
        }
    }

    static func createBy(master: UITabBarController, detail: UINavigationController) -> JDSplitViewController {
        let splitController: JDSplitViewController
        if kDeviceIsiPad {
            if #available(iOS 26.0, *) {
                splitController = JDSplitViewController(style: columnStyle == .doubleColumn ? .doubleColumn : .tripleColumn)
            } else {
                splitController = JDSplitViewController(nibName: nil, bundle: nil)
            }
        } else {
            splitController = JDSplitViewController(nibName: nil, bundle: nil)
        }

        splitController.setupSplitViewController(master: master, detail: detail)
        return splitController
    }
ini 复制代码
private func setupSplitViewController(master: UITabBarController, detail: UINavigationController) {
        // 设置主视图和详情视图
        masterViewController = master
        detailViewController = detail
        if #available(iOS 13.0, *) {
            primaryBackgroundStyle = .none
        }

        if kDeviceIsiPad {
            // ipad 分屏
            if #available(iOS 26.0, *) {
                setViewController(master, for: .primary)
                setViewController(detail, for: .secondary)

                // 设置主列 leading显示
                primaryEdge = .leading
                presentsWithGesture = false // 禁用滑动手势隐藏主列和show/hide的primary按钮

                setupScreenLayout()
                
            } else {
                // iOS 26以下使用 viewcontrollers方案,不然iOS14 setViewController(master, for: .primary)崩溃
                // Exception    NSException *    "UITabBarController is unsupported as viewController for -[UISplitViewController setViewController:forColumn:] in Primary column"
                preferredDisplayMode = .oneBesideSecondary
                preferredPrimaryColumnWidthFraction = 0.5
                maximumPrimaryColumnWidth = kScreenMaxLength / 2
                viewControllers = [master, detail]
            }
        } else {
            // iphone 不分屏
            preferredDisplayMode = .automatic
            preferredPrimaryColumnWidthFraction = 1.0
            maximumPrimaryColumnWidth = kScreenMaxLength
            viewControllers = [master]
        }

        delegate = self
    }
swift 复制代码
private func setupScreenLayout() {
        guard  #available(iOS 26.0, *) else {
            return
        }
    
        // 详细配置:https://developer.apple.com/documentation/UIKit/UISplitViewController
        
        // 平铺
        preferredSplitBehavior = .tile
        // none非slidebar, ios26.0设置了好像没效果,都是sidebar效果
        primaryBackgroundStyle = .none
        
        // 设置分屏布局样式为左边主视图,右边详情视图
        preferredPrimaryColumnWidthFraction = 0.5
        if Self.columnStyle == .doubleColumn {
            // oneBesideSecondary展示左右并排
            preferredDisplayMode = .oneBesideSecondary
            // doubleColumn 不能设置Supplementary 相关属性如:ColumnWidth
            // preferredSupplementaryColumnWidth = 0
        } else {
            // 必须这个模式
            preferredDisplayMode = .twoDisplaceSecondary
            // iOS26.0 系统大概设置了一个10pt的leading 边距(32的top),为了对称设置preferredSupplementaryColumnWidth
            preferredSupplementaryColumnWidth = 10
        }
    }
相关推荐
songgeb2 小时前
NumberFormatter 货币格式化属性详解
ios·swift
for_ever_love__5 小时前
UI学习:数据驱动ce l l
学习·ui·ios·objective-c
KillerNoBlood5 小时前
2026移动端跨平台开发面经总结
android·算法·flutter·ios·移动开发·鸿蒙·kmp
人月神话-Lee6 小时前
【图像处理】颜色科学与灰度化——人眼看到的和数字记录的不一样
图像处理·人工智能·计算机视觉·ios·swift
号码认证服务7 小时前
给用户打电话,怎么在对方手机显示为“XX证券”?号码认证办理步骤
android·运维·服务器·ios·智能手机·iphone·webview
MonkeyKing7 小时前
iOS 启动优化实战:pre-main耗时、二进制重排与动态库裁剪全解析
ios
MonkeyKing7 小时前
iOS 卡顿优化实战:离屏渲染、混合图层与圆角优化全解析
ios
库奇噜啦呼9 小时前
【iOS】源码学习-消息流程分析
学习·ios·cocoa
2501_915918419 小时前
iOS性能数据监控:从概念到工具实践,让应用运行更流畅
android·macos·ios·小程序·uni-app·cocoa·iphone