UICollectionViewCell宽度大于我在sizeForItemAt

时间:2019-03-28 22:47:48

标签: ios uicollectionview uicollectionviewcell uicollectionviewflowlayout uicollectionviewdelegate

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

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

因此,一个单元格的宽度应为UICollectionViewcollectionView.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 Simulator上正常工作(我编辑了图像以在第一行中放置两个项目以检查它们是否适合):

enter image description here

那么iPhone SE怎么了?

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

4 个答案:

答案 0 :(得分:1)

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

原因是在iPhone 6s模式下设置了collectionView的宽度限制,但是后来切换到SE模拟器时,此限制未更新。

答案 1 :(得分:0)

我认为存在单元间距问题。似乎您的实现中存在默认的单元格间距。您应该尝试使用以下代码在collectionview的原始位置调整两个单元格:

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约束符合您的要求,则应进行检查。

答案 2 :(得分: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
}

希望这会有所帮助。

答案 3 :(得分:0)

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

   DispatchQueue.main.asyncAfter(deadline: .now() + 0.10) {
       self.myCollectionView.reloadData()
   }