UICollectionView 包装器视图框架更新

Posted

技术标签:

【中文标题】UICollectionView 包装器视图框架更新【英文标题】:UICollectionView wrapper view frame update 【发布时间】:2017-12-25 04:08:43 【问题描述】:

我有一个由 UIView 包装的集合视图,集合视图与包装视图具有相同的边界。并且集合视图数据源将被更改,因此包装视图边界也将被更改。我已经用collectionView.collectionViewLayout.collectionViewContentSize实现了包装视图intrinsicContentSize方法,并且集合视图布局是UICollectionViewFlowLayout的子类,UICollectionView的单元格也实现了方法intrinsicContentSize,但是包装视图没有用集合更新框架查看内容大小。 collectionViewContentSize 始终是 CGRectZero。 我试过了

  [self.layout invalidateLayout];
  [self.collectionView reloadData];
  [self.collectionView layoutIfNeeded];

但没用, 我应该怎么做才能用collectionView.collectionViewLayout.collectionViewContentSize 更新包装视图框架。

下面有一些代码:

  ZXCollectionViewWrapperView *wrapperView = [[ZXCollectionViewWrapperView alloc] init];
  [self.view addSubview:wrapperView];
  [wrapperView mas_makeConstraints:^(MASConstraintMaker *make) 
    make.center.equalTo(self.view);
  ];
  self.wrapperView = wrapperView;

   /// wrapper view size 
- (CGSize)intrinsicContentSize 
  return self.collectionView.collectionViewLayout.collectionViewContentSize;



  ZXCollectionViewAlignedLayout *layout = [[ZXCollectionViewAlignedLayout alloc] init];
  self.layout = layout;
  ZXCollectionView *collectionView = [[ZXCollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
  collectionView.dataSource = self;
  collectionView.delegate = self;
  collectionView.backgroundColor = [UIColor lightGrayColor];
  [self addSubview:collectionView];
  [collectionView mas_makeConstraints:^(MASConstraintMaker *make) 
    make.edges.equalTo(self);
  ];
  self.collectionView = collectionView;

  [self.collectionView zx_registerCellClass:[ZXCommendCell class]];

  self.dataSource = dataSource;
  [self.collectionView reloadData];
  [self.collectionView layoutIfNeeded];

【问题讨论】:

【参考方案1】:

当您使用自动布局时,您应该为包装视图创建一个高度约束。然后您可以将该约束的常量更改为等于集合视图内容大小,如下所示:

heightConstraint = make.height.equalTo(200) // initial height

那么你可以使用KVO来观察collection view content size的变化和设置

heightConstraint.constant = collectionView.contentSize.height

观察contentSize可以参考这个:observing contentSize (CGSize) with KVO in swift

【讨论】:

我希望包装器视图通过 UICollectionView contentSize 调整大小,就像带有包装器视图的 UILabel 一样。(带有包装器视图的 UIlLabel 确实有效,我已经尝试过了)。 你不能用集合视图来做到这一点,因为它是一个滚动视图

以上是关于UICollectionView 包装器视图框架更新的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 包装 UICollectionView 并使用组合布局

如何包装 UICollectionView

如何用边框(阴影)包装 UICollectionView 部分和项目?

UICollectionView 方向改变事故?

框架没有正确更新 UICollectionView 作为 UITableViewCell 子视图

如何在UICollectionView上面实现内容视图