UICollectionViewCell和UICollectionView

时间:2015-12-16 17:51:02

标签: ios swift uicollectionview

我应该如何设置UICollectionView中单元格的高度等于集合视图的高度?下面的代码不起作用,因为此时的集合视图高度是未知的,因为自动布局在这个阶段搞乱了属性。它会导致单元格高度高于实际的集合视图。

我会在解决此问题的答案中添加300个赏金!

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

       return CGSize(width: 100, height: collectionView.frame.size.height)
    }
  

2015-12-16 18:43:53.643 My-app [1055:434762]输入的行为   代码hereUICollectionViewFlowLayout未定义,因为:2015-12-16   18:43:53.643 My-app [1055:434762]项目高度必须小于   UICollectionView的高度减去顶部和底部的插入部分   值减去内容的顶部和底部值。二零一五年十二月十六日   18:43:53.643我的应用[1055:434762]请检查值的返回值   代表。 2015-12-16 18:43:53.644 My-app [1055:434762]相关   UICollectionViewFlowLayout实例是,它附加到; layer =; contentOffset:{0,0}; contentSize:{3087,307}>   集合视图布局:。   2015-12-16 18:43:53.644 My-app [1055:434762]制作一个象征性的断点   在UICollectionViewFlowLayoutBreakForInvalidSizes来捕获它   调试器。

基于hannads建议的解决方案。如果有更好的方法请告诉我

与财产观察员建立了一个财产。

var myCollectionViewHeight: CGFloat = 0.0 {
    didSet {
        if myCollectionViewHeight != oldValue {
            myCollectionView.collectionViewLayout.invalidateLayout()
            myCollectionView.collectionViewLayout.prepareLayout()
        }
    }
}

覆盖此方法(多次调用)

override func viewDidLayoutSubviews() {
    myCollectionViewHeight = myCollectionView.bounds.size.height
}

然后我在我的代表中有这个:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {            
            return CGSize(width: 100, height: myCollectionViewHeight)
    }

6 个答案:

答案 0 :(得分:10)

我将如何做到这一点。首先在视图控制器中添加一个全局变量,该变量将用于存储集合视图的高度。在viewDidLayoutSubviews方法中,将此变量设置为collectionView的高度,如果更改,则调用方法以使UICollectionView布局无效

collectionView.collectionViewLayout.invalidateLayout()

将调用该方法来设置collectionView单元格的大小,并在该方法中,将单元格的高度设置为包含collectionView高度的全局变量。

注意:目前在我的手机上并没有测试此代码。我可能错过了一些东西。

答案 1 :(得分:1)

就我而言,我必须将 collectionViewLayout.estimatedItemSize 设置为显式值(其高度 <= 集合视图的高度)而不是 UICollectionViewFlowLayout.automaticSize

UICollectionViewFlowLayout.automaticSize 导致默认的 50pt x 50pt 单元格大小,高于我的集合视图。在这种情况下,UIKit 拒绝做任何布局工作,尽管 self-sizing 计算后的实际单元格尺寸会更小。

// horizontally scrollable collection view

private var viewHeight: CGFloat?

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    
    if viewHeight != view.bounds.height {
        viewHeight = view.bounds.height
        layout.estimatedItemSize = CGSize(width: 50, height: viewHeight!)
        layout.invalidateLayout()
    }
}

答案 2 :(得分:0)

我也遇到了这个问题,我可以通过减去相关的sectionInsets来解决它。一旦你减去.size.height属性中未考虑的插图,它就会接受高度。

sizeForItemAtIndexPath内,你需要减去插入尺寸...

  let sectionInset = self.collectionView?.collectionViewLayout.sectionInset
  let heightToSubtract = sectionInset!.top + sectionInset!.bottom

  return CGSize(width: 100.0, height: (self.collectionView?.bounds.height)! - heightToSubtract)

注意:我强行打开这里的选项,但为了安全起见,您可能需要检查它们

答案 3 :(得分:0)

我遇到了这个问题,因为我已将UICollectionView固定在UITableViewCell的底部而没有给collectionView一个高度。

在发出一些网络请求然后在[self.tableView reloadData]中调用UIViewController之后,我在日志中收到了相同的错误消息。

我设法通过打破底部约束并赋予UICollectionView固定高度来解决它。

答案 4 :(得分:0)

我在这个问题上苦苦挣扎了一个多星期,终于找到了适合我具体情况的答案。我的问题是由于1)在UICollectionViewCell的图像中加载远程图像,以及2)估计的单元格大小大于我在集合视图布局的sizeForItemAt上手动设置的大小而导致的。

enter image description here

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

我能够通过将故事板上的单元格大小减小到小于我的单元格大小来解决问题,并且还将“估计大小”设置为“无”(这最后一部分可能就足够了)

答案 5 :(得分:0)

通过在 viewdidload 中设置 collectionViewLayout itemSize 属性可以轻松解决这个问题:

collectionViewLayout.itemSize = .init(width: 80, height: 80)