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

问题描述 投票:0回答:3

我的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也存在同样的问题

ios uicollectionview uicollectionviewcell uicollectionviewflowlayout uicollectionviewdelegate
3个回答
1
投票

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

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


0
投票

我认为存在细胞间距问题。似乎您的实现中存在默认的单元格间距。你应该尝试下面的代码来调整一个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的约束,如果它是你的要求或不。


0
投票

尝试使用视图中的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
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.