我的目标是布置一个可编辑的集合视图,使其内容填满屏幕 - 给定部分中每个项目的总宽度应该添加以填充集合视图的宽度(带1行每个部分),并且应添加每个部分的总高度以填充集合视图的高度。
下面的代码让我得到了我想要的东西,并补偿了边距:
//in a UIViewController
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let margin = (
horizontal: collectionView.layoutMargins.left + collectionView.layoutMargins.right,
vertical: collectionView.layoutMargins.top + collectionView.layoutMargins.bottom
)
return CGSize(
width: (collectionView.bounds.width - margin.horizontal) / CGFloat(collectionView.numberOfItems(in: indexPath.section),
height: (collectionView.bounds.height - margin.vertical) / CGFloat(collectionView.numberOfSections)
)
}
有了这个,这些项目的大小可以填满整个屏幕 - 除了一个例外。
从iOS 11开始,UICollectionViews现在具有自动拖动功能。删除不会暴露给数据源的占位符 - 类似collectionView.numberOfItems(in: indexPath.section)
的内容将报告相同的数字是否存在占位符。结果是,在放置期间添加占位符时,节中的项会溢出到第二行。
然而,Apple似乎默默地添加了UIDataSourceTranslating,这让我们在一定程度上解决了这个问题:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let margin = (
horizontal: collectionView.layoutMargins.left + collectionView.layoutMargins.right,
vertical: collectionView.layoutMargins.top + collectionView.layoutMargins.bottom
)
var itemsInSection = 0
var numberOfSections = 0
//undocumented, but seems to work as the name suggests in this example:
collectionView.performUsingPresentationValues {
itemsInSection = collectionView.numberOfItems(inSection: indexPath.section)
numberOfSections = collectionView.numberOfSections
}
return CGSize(
width: (collectionView.bounds.width - margin.horizontal) / CGFloat(itemsInSection),
height: (collectionView.bounds.height - margin.vertical) / CGFloat(collectionView.numberOfSections)
)
}
此类工作 - 添加占位符时,该部分中的常规项会缩小。但是,这仍然不能可靠地防止溢出到第二行的部分。也许它没有调整占位符的大小?
是否有人能够正确选择所有尺寸的解决方案,这可以解决阻力问题。降?