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

