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
        }
    }
相关推荐
茶底世界之下9 小时前
Metal 冷启动并发下,Pipeline Cache 为什么必须合并在途编译
ios·swift
weixin_4038101310 小时前
用 Python 调 EasyClick iOS 免越狱脚本:开放接口对接步骤与参数
ios·iphone
weixin_4038101312 小时前
EasyClick iOS 免越狱自动化脚本怎么写:从环境判断到跑通第一个脚本
运维·ios·自动化
weixin_4038101313 小时前
不用越狱也能批量控制 iPhone:EasyClick iOS 免越狱脚本实战
ios·iphone
weixin_4038101314 小时前
iOS 自动化脚本怎么输入文字:代理、输入法与快捷指令三级方案
运维·ios·自动化
黑科技iOS上架2 天前
双引擎解决oc/swift开发引用加固难题
开发语言·ios·swift·审核·ios混淆·执行程序差异化
wechatbot8882 天前
企微第三方自动化开发:原生能力无阉割 API 开放平台介绍
后端·ios·微信·企业微信·ai编程·ipad
黑科技iOS上架2 天前
iOS framework/dylib动态库定向加固实战
macos·ios·objective-c·cocoa·审核·ios混淆·执行程序差异化
可乐鸡翅yeah_2 天前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
茶底世界之下3 天前
为什么高精度透明图片上传到 Metal 时,必须把“拷贝像素”与“混合合成”分开
ios