UICollectionView 不适合某些 Apple 设备上的视图控制器

Posted

技术标签:

【中文标题】UICollectionView 不适合某些 Apple 设备上的视图控制器【英文标题】:UICollectionView not fitting within view controller on certain Apple devices 【发布时间】:2019-08-21 06:56:02 【问题描述】:

我制作了一个UICollectionView,它在大多数类型的 iPhone 上都能正常显示。但是,在 iPhone SE 等较小的设备上,即使我正确设置了约束,集合视图单元也会超出页面。我收到以下错误:

the behavior of the UICollectionViewFlowLayout is not defined because:
the item width must be less than the width of the UICollectionView minus
the section insets left and right values, minus the content insets left and right values.

我尝试了许多提到的other solutions 人,例如self.collectionView.collectionViewLayout.invalidateLayout() 或将contentInsetAdjustmentBehavior 设置为.never (link here),但到目前为止,它们都没有奏效,并且集合视图仍然超出页面适用于较小的 ios 设备。任何帮助将不胜感激。

【问题讨论】:

添加您一直用来计算collectionViewCell 大小的代码。 你解决了这个问题吗? 【参考方案1】:

您需要动态设置UICollectionViewCell 的大小,这是在代码中完成的,而不是在情节提要上。

override func viewDidLoad() 
    let width = self.bounds.width // This is the width of the superview, in your case probably the `UIViewController`
    let height = 70 // Your desired height, if you want it to full the superview, use self.bounds.height
    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: width, height: self.bounds.height) // Sets the dimensions of your collection view cell. 

【讨论】:

您的解决方案奏效了!我一直将单元格宽度设置为 collectionView.bounds.width 而不是视图控制器的宽度,这就是单元格布局没有改变的原因 @AhsokaTano 很高兴你修好了!当我第一次开始使用 colloctionViews 时,我遇到了同样的问题。【参考方案2】:

可能的解决方案:(将此代码放在 ViewDidLoad() 函数中)

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0) //set section inset as per your requirement.
layout.itemSize = CGSize(width: screenWidth/3, height: screenWidth/3) //set cell item size here 
layout.minimumInteritemSpacing = 0 //set Minimum spacing between 2 items
layout.minimumLineSpacing = 0  //set minimum vertical line spacing here between two lines in collectionview
collectionView!.collectionViewLayout = layout 

【讨论】:

【参考方案3】:

你可以使用func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize方法

minimumInteritemSpacing计算即可,不要忘记sectionInset

extension ViewController: UICollectionViewDelegateFlowLayout 
  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    let numberOfCellInColumn = 4.0

    if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout 
      let interitemSpace = flowLayout.minimumInteritemSpacing
      let cellWidth = (collectionView.bounds.width - (numberOfCellInColumn - 1) * interitemSpace - flowLayout.sectionInset.left - flowLayout.sectionInset.right) * (1.0/numberOfCellInColumn)
      return CGSize(width: cellWidth, height: cellWidth)
    
    return CGSize.zero
  

此代码返回屏幕上 4 列的单元格大小

【讨论】:

以上是关于UICollectionView 不适合某些 Apple 设备上的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 约束不允许滚动

使 UITableViewCell 适合 UICollectionView 而没有 tableView heightForRowAt

UICollectionView超出边界的动画单元格

如何在 UICollectionView 中向下移动某些单元格

如何调整 UICollectionView 单元格的大小以适合其中的内容?

重用单元格 UICollectionView - 某些单元格没有被选中