Ios UICollectionViewCell的等高';s和UICollectionView

Ios UICollectionViewCell的等高';s和UICollectionView,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,如何将UICollectionView中的单元格高度设置为集合视图的高度?下面的代码不起作用,因为此时不知道集合视图的高度,这似乎是因为在此阶段自动布局会干扰属性。这会导致单元格高度高于实际集合视图 我会在解决这个问题的答案上增加300英镑的赏金 2015-12-16 18:43:53.643我的应用程序[1055:434762]用户的行为 此处未定义代码UICollectionViewFlowLayout,因为:2015-12-16 18:43:53.643我的应用程序[1055:434762

如何将UICollectionView中的单元格高度设置为集合视图的高度?下面的代码不起作用,因为此时不知道集合视图的高度,这似乎是因为在此阶段自动布局会干扰属性。这会导致单元格高度高于实际集合视图

我会在解决这个问题的答案上增加300英镑的赏金

2015-12-16 18:43:53.643我的应用程序[1055:434762]用户的行为 此处未定义代码UICollectionViewFlowLayout,因为:2015-12-16 18:43:53.643我的应用程序[1055:434762]项目高度必须小于 UICollectionView的高度减去插入顶部和底部的截面 值,减去插入顶部和底部值的内容。2015-12-16 18:43:53.643我的应用程序[1055:434762]请检查 代表。2015-12-16 18:43:53.644我的应用程序[1055:434762]相关 UICollectionViewFlowLayout实例为,并已附加到;层=;contentOffset:{0,0};contentSize:{3087307}> 集合视图布局:。 2015-12-16 18:43:53.644我的应用程序[1055:434762]创建一个符号断点 在UICollectionViewFlowLayoutBreakForInvalidSizes中,在 调试器

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

与属性观察者创建属性

var myCollectionViewHeight: CGFloat = 0.0 {
    didSet {
        if myCollectionViewHeight != oldValue {
            myCollectionView.collectionViewLayout.invalidateLayout()
            myCollectionView.collectionViewLayout.prepareLayout()
        }
    }
}
重写此方法(它被多次调用)

那么我的代表中有这样一个:

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

您尝试将此代码设置为您的
viewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

希望这有帮助

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

collectionView.collectionViewLayout.invalidateLayout()
它将调用该方法来设置collectionView单元格的大小,并在该方法中,将单元格的高度设置为保存collectionView高度的全局变量


注意:当前在我的手机上,未测试此代码。我可能遗漏了一些东西。

我也遇到了这个问题,我可以通过减去相关的
部分插图来解决它。减去
.size.height
属性中未考虑的插入后,它将接受高度

sizeFormiteIndeXPath
中,您需要减去部分插入维度

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

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

注意:我在此处强制展开选项,但为了安全起见,您可能需要检查它们

我出现此问题,因为我将
UICollectionView
固定在
UITableViewCell
的底部,而没有给
collectionView
一个高度

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


我通过打破底部约束并给
UICollectionView
一个固定的高度来解决这个问题。

在我的例子中,我将collectionview添加到tableviewcell,collectionview项目高度等于tableviewcell高度。当更改TableViewCellHeight时,我收到此警告。 要解决此问题,请尝试以下代码

  if (@available(iOS 11.0, *)) {
        _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
    }

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


我可以通过将故事板上的单元格大小减小到比我的单元格大小小的数量来解决问题,并且我还将“Estimate size”设置为“None”(最后一部分可能足够了)

在我的情况下,我必须将
collectionViewLayout.estimatedItemSize
设置为显式值(它有它的高度,但问题是我已经用委托方法将inset设置为0。那么这应该没有必要了。@LuckyLuke我假设你的contentInset也设置为0?你已经打印出了这些值,可以确认一切都是0吗?我不知道,因为有东西告诉你高度大于正在设置collectionView.bounds.height的内容,如果不查看项目就很难判断这离工作不远。我将用完整的答案更新我的问题。但是请注意,这将在开始时以及在使布局无效后对集合视图进行一次布局。这不是最有效的解决方案,而是最有效的解决方案我知道。将等待您的更新。@LuckyLuke您提到多次调用
viewDidLayoutSubviews
。我认为每次设置
myCollectionViewHeight
时都会调用
didSet
,即使它的值相同。您是否可以添加一个if语句来检查
myCollectionViewHeight
是否不相等设置它之前,将其设置为myCollectionView.bounds.size.height
?这可能会有帮助。是的,我可以这样做。使用当前设置,每次ViewDidLayoutSubview调用Did属性observer时,都会调用Did属性observer。我将根据您的建议进行更改。这不会改变ViewDidLayoutSubview被多次调用的事实,但我想这是正确的因为自动布局正在调整或诸如此类的事情。@LuckyLuke您说它离工作不远了。它仍然会给您带来问题吗?在情节提要中设置此属性也有助于偏移。否则,当您将任何UICollectionView放入UINavigationController时,它都会被按下。取消选中“调整滚动视图插入”
“automaticallyAdjustsScrollViewInsets”在iOS 11.0中被弃用:改用UIScrollView的ContentInsertAdjustmentBehavior
  let sectionInset = self.collectionView?.collectionViewLayout.sectionInset
  let heightToSubtract = sectionInset!.top + sectionInset!.bottom

  return CGSize(width: 100.0, height: (self.collectionView?.bounds.height)! - heightToSubtract)
  if (@available(iOS 11.0, *)) {
        _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
    }
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.bounds.width, height: collectionView.bounds.height)
}
// 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()
    }
}