绑定UICollectionView更改时调整单元格大小

时间:2014-02-10 17:01:14

标签: uicollectionview uicollectionviewcell

我正在使用水平分页UICollectionView来显示可变数量的集合视图单元格。每个集合视图单元的大小需要等于集合视图的大小,并且只要集合视图的大小发生更改,集合视图单元的大小就需要相应地更新。后者导致问题。当集合视图的大小发生更改时,不会更新集合视图单元格的大小。

使布局无效似乎没有办法。对UICollectionViewFlowLayout进行子类化并覆盖shouldInvalidateLayoutForBoundsChange:也不起作用。

为了您的信息,我正在使用UICollectionViewFlowLayout的实例作为集合视图的布局对象。

3 个答案:

答案 0 :(得分:1)

我认为下面的解决方案更清洁。您只需覆盖UICollectionViewLayout的方法之一,如:

- (void)invalidateLayoutWithContext:(UICollectionViewFlowLayoutInvalidationContext *)context
{
  context.invalidateFlowLayoutAttributes = YES;
  context.invalidateFlowLayoutDelegateMetrics = YES;
  [super invalidateLayoutWithContext:context];
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
  if(!CGSizeEqualToSize(self.collectionView.bounds.size, newBounds.size))
  {
    return YES;
  }

  return NO;
}

答案 1 :(得分:0)

我的应用程序中有类似的行为:UICollectionView单元格应始终与集合视图具有相同的宽度。从true返回shouldInvalidateLayoutForBoundsChange:也不适用于我,但我设法让它以这种方式运作:

class AdaptableFlowLayout: UICollectionViewFlowLayout {
    var previousWidth: CGFloat?

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        let newWidth = newBounds.width
        let shouldIvalidate = newWidth != self.previousWidth
        if shouldIvalidate {
            collectionView?.collectionViewLayout.invalidateLayout()
        }
        self.previousWidth = newWidth
        return false
    }
}

在文档中声明,当shouldInvalidateLayoutForBoundsChange返回true时,将调用invalidateLayoutWithContext:。我不知道为什么invalidateLayout有效且invalidateLayoutWithContext:没有。

答案 2 :(得分:0)

Swift 4 Xcode 9实现的高度变化:

final class AdaptableHeightFlowLayout: UICollectionViewFlowLayout {
    var previousHeight: CGFloat?

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        let newHeight = newBounds.height
        let shouldIvalidate = newHeight != self.previousHeight
        if shouldIvalidate {
            collectionView?.collectionViewLayout.invalidateLayout()
        }
        self.previousHeight = newHeight
        return false
    }
}