UICollectionViewCell宽度大于我在sizeForItemAt中设置的宽度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UICollectionViewCell宽度大于我在sizeForItemAt中设置的宽度相关的知识,希望对你有一定的参考价值。

我的UICollectionView的宽度/高度匹配所有可用空间。

我想在一行中显示两个单元格(两列)

所以一个单元格的宽度应该是UICollectionView的一半宽度(collectionView.frame.width / 2

所以我在UICollectionViewDelegateFlowLayout函数中以编程方式更改单元格的宽度:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.width / 2.0, height: 150)
}

但视觉上的细胞宽度比collectionView.frame.width / 2.0大得多(在iPhone SE模拟器上测试)

因此它需要超过半宽的屏幕空间

这里我打印了有关尺寸的信息:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath)
    print("didSelectItemAt (cell.frame.width), table width: (collectionView.frame.width), item calc width: (collectionView.frame.width / 2)")
}

didSelectItemAt单元格宽度187.5,表格宽度:375.0,半宽:187.5

enter image description here

为什么会这样?

利润率也存在问题,但首先我必须解决这个问题

更新

虽然它适用于iPhone 6s模拟器(我编辑了图像,在第一行放置两个项目,以检查它们是否合适):

enter image description here

那么iPhone SE有什么问题?

我不想发现其他iPhone或iPad也存在同样的问题

答案

375.0是iPhone 6s和X的大小,而不是iPhone SE的320.0

原因是collectionView的宽度约束是在iPhone 6s模式下设置的,但是当切换到SE模拟器时,此约束没有更新。

另一答案

我认为存在细胞间距问题。似乎您的实现中存在默认的单元格间距。你应该尝试下面的代码来调整一个rawview集合中的两个单元格:

extension ViewController : UICollectionViewDelegateFlowLayout{

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let collectionViewWidth = collectionView.bounds.width
        return CGSize(width: collectionViewWidth/2, height: 150)
    }

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

此外,你应该检查你的UICollectionView的约束,如果它是你的要求或不。

另一答案

尝试使用视图中的wide,而不是collectionView。

试试这个:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: (view.frame.width / 2.0) - 5, height: 150) // provide little bit space between cells
}

希望这会有所帮助。

以上是关于UICollectionViewCell宽度大于我在sizeForItemAt中设置的宽度的主要内容,如果未能解决你的问题,请参考以下文章

如果它们的总宽度大于 UICollectionView 宽度,则剪辑最后一个 UICollectionViewCell

UICollectionViewCell -- 使 selectedBackgroundView 比单元格本身大

UICollectionViewCell 不填充屏幕宽度

如何设置动态宽度 UICollectionViewCell

UICollectionViewCell 中的自动布局宽度常量无法正常工作

iOS - UICollectionViewCell 的动态大小宽度