如何实现NSCollectionLayoutItem高度为宽度加固定像素的混合尺寸设置
实现方案
该需求可以实现,你可以通过NSCollectionLayoutDimension的custom构造器实现自定义尺寸计算,无需依赖固定比例或绝对值。
实现原理
NSCollectionLayoutDimension提供的custom闭包会在每次布局刷新时自动执行,闭包会传入当前的容器尺寸、布局环境参数,你可以在闭包内先计算出元素的实际宽度,再叠加固定的像素偏移得到最终高度,完全适配动态容器尺寸(比如屏幕旋转、分屏调整等场景)。
代码示例
你需要把原代码中无法实现动态高度的部分替换为自定义计算逻辑,示例如下:
private lazy var myFancyLayout: NSCollectionLayoutSection = { let itemSize = NSCollectionLayoutSize( widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0) ) let item = NSCollectionLayoutItem(layoutSize: itemSize) // 实现:group宽度为父容器的一半,高度 = 自身宽度 + 20px let groupSize = NSCollectionLayoutSize( widthDimension: .fractionalWidth(0.5), heightDimension: .custom({ context in // 计算当前group的实际宽度:父容器有效宽度 * 0.5 let groupWidth = context.container.effectiveContentSize.width * 0.5 // 高度 = 宽度 + 固定偏移值,你可以把20替换为需要的28 return groupWidth + 20 }) ) let group = NSCollectionLayoutGroup.horizontal( layoutSize: groupSize, subitem: item, count: 1 ) let section = NSCollectionLayoutSection(group: group) // ... 其他配置 return section }()
注意事项
- 该API的系统版本要求和组合布局本身一致,为iOS 13.0+/iPadOS 13.0+/macOS 10.15+,无需额外适配更高版本
- 闭包内的计算逻辑会在容器尺寸变化时自动重新执行,不需要手动触发布局刷新
内容的提问来源于stack exchange,提问作者user236739
相关产品推荐
相关产品推荐

