ios - UICollectionView 不遵守 UICollectionViewDelegateFlowLayout 和插图

标签 ios swift uicollectionview

所以我有一个具有以下代码的 CollectionView:

class MyViewController: UIViewController {
    ...
    @IBOutlet weak var imageCollectionView: UICollectionView!
    fileprivate let sectionInsets = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    fileprivate let itemsPerRow: CGFloat = 3
    ...

    override func viewDidLoad() {
        super.viewDidLoad()
        imageCollectionView.delegate = self
        imageCollectionView.dataSource = self
   }
}

...

extension MyViewController : UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {

        let paddingSpace = sectionInsets.left * (itemsPerRow + 1)
        let availableWidth = collectionView.bounds.width - paddingSpace
        let widthPerItem = availableWidth / itemsPerRow

        return CGSize(width: widthPerItem, height: widthPerItem)
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        insetForSectionAt section: Int) -> UIEdgeInsets {
        return sectionInsets
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return sectionInsets.left
    }
}

我想要的是每行 3 个单元格,它们之间的空间非常小,但每当我运行该应用程序时,我都会得到如下信息: enter image description here

其中每个黑色 block 是一个单元格。

对于我发现的类似问题,答案通常是实现我已经完成的 UICollectionViewDelegateFlowLayout 函数,我的函数正在被调用,但没有按预期工作!即使我手动将 widthPerItem 值稍微变小,它仍然不起作用!

谁能看出我是否遗漏了一些明显的东西? 谢谢!

最佳答案

您确定最小项目间距设置为仅 1 磅吗? 您可以在 Interface Builder 中或通过覆盖以下委托(delegate)方法进行设置:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0;
}

我看到的另一个可能的原因是 availableWidth 除以 itemsPerRow 的结果是一个 float 。最后,单元格宽度和插图的总和可能实际上超过 Collection View 宽度 0.x 像素。为确保不会发生这种情况,您可能需要使用 floor:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    let paddingSpace = sectionInsets.left * (itemsPerRow + 1)
    let availableWidth = collectionView.bounds.width - paddingSpace
    let widthPerItem = floor(availableWidth / itemsPerRow)

    return CGSize(width: widthPerItem, height: widthPerItem)
}

关于ios - UICollectionView 不遵守 UICollectionViewDelegateFlowLayout 和插图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47784015/

相关文章:

ios - 我可以在 GeoFire 查询上应用分页以减少加载时间吗

ios - 是否可以知道 QLPreviewController 何时到达文档末尾?

ios - UICollectionView 水平滚动,数据从左向右流动

ios - 在 UI ImageView 中检索和显示保存的图像(文档文件夹)

ios - 如何在 iPhone 中播放视频时触发自定义视频播放器?

objective-c - 返回应用程序后,Facebook 登录信息无法正确识别

ios - 创建一个按钮来滚动 UICollectionView

css - iOS 视网膜 safari bug 渲染边界半径?

java - 如何在不出现 UnsatifiedLinkError 的情况下加载具有依赖项的 JNI .dylib 文件?

ios - 来自 UICollectionViewCell 的 UIAlertController