0

我的宽度/高度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

在此处输入图像描述

为什么会这样?

边距也有问题,但首先我必须解决这个问题

更新

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

在此处输入图像描述

那么 iPhone SE 有什么问题呢?

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

4

4 回答 4

2

375.0 是 iPhone 6s 和 X 的尺寸,而不是 iPhone SE 的 320.0

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

于 2019-03-29T03:11:35.753 回答
0

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

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是否符合您的要求。

于 2019-03-29T05:52:07.143 回答
0

尝试使用视图中的宽度,而不是 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
}

希望这会有所帮助。

于 2019-03-29T06:03:10.143 回答
0

最好的解决方案是,在主线程中重新加载您的集合视图,并稍作延迟。

   DispatchQueue.main.asyncAfter(deadline: .now() + 0.10) {
       self.myCollectionView.reloadData()
   }
于 2021-07-30T11:00:07.690 回答