iOS 11:根据部分中的项目数(包括占位符)

时间:2017-09-05 18:57:48

标签: ios swift uicollectionview uicollectionviewlayout ios11

我的目标是布置一个可编辑的集合视图,使其内容填满屏幕 - 给定部分中每个项目的总宽度应该添加以填充集合视图的宽度(带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)
    )
}

此类工作 - 添加占位符时,该部分中的常规项会缩小。但是,这仍然不能可靠地防止溢出到第二行的部分。也许它没有调整占位符的大小?

是否有人能够正确选择所有尺寸的解决方案,这可以解决阻力问题。降?

0 个答案:

没有答案