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

iOS16.0中horizontal(layoutSize:subitem:count:)已弃用问题求助

解决iOS16+ NSCollectionLayoutGroup.horizontal方法废弃问题

你遇到的是iOS16开始NSCollectionLayoutGroup.horizontal(layoutSize:subitem:count:)方法被废弃的警告,以下是兼容iOS16+的修改方案,同时优化布局逻辑避免留白:

修改要点

  • 替换废弃API:用NSCollectionLayoutGroup.horizontal(layoutSize:subitems:)替代原方法,将item重复指定次数后传入数组参数
  • 优化item宽度:根据列数动态计算item的宽度占比,让item自动适配group宽度,避免布局留白

修改后的完整代码

private func layout() -> UICollectionViewCompositionalLayout {
    let layout = UICollectionViewCompositionalLayout { sectionIndex, environment -> NSCollectionLayoutSection? in
        // 计算当前列数:宽屏且开关开启时显示2列,否则1列
        let columns = (environment.container.contentSize.width > 500 && self.toggleSwitch.isOn) ? 2 : 1
        // 动态计算item宽度占比,确保每列均匀分配空间
        let itemWidthRatio = 1.0 / CGFloat(columns)
        
        let itemSize = NSCollectionLayoutSize(
            widthDimension: .fractionalWidth(itemWidthRatio),
            heightDimension: .estimated(400)
        )
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(
            widthDimension: .fractionalWidth(1.0),
            heightDimension: .estimated(400)
        )
        
        // 使用iOS16+兼容的方式创建group
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: Array(repeating: item, count: columns))
        
        group.interItemSpacing = .fixed(20)
        
        if columns > 1 {
            group.contentInsets.leading = 20
            group.contentInsets.trailing = 20
        }
        
        let section = NSCollectionLayoutSection(group: group)
        section.interGroupSpacing = 20
        section.contentInsets.top = 20
        
        return section
    }
    
    let config = UICollectionViewCompositionalLayoutConfiguration()
    config.interSectionSpacing = 50
    layout.configuration = config
    
    return layout
}

兼容iOS15及以下版本

如果需要支持iOS15及更早系统,可以添加版本判断:

// 替换原group创建代码
let group: NSCollectionLayoutGroup
if #available(iOS 16.0, *) {
    group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: Array(repeating: item, count: columns))
} else {
    group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: columns)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:10