我有一个UIView的集合视图包装,集合视图与包装器视图具有相同的边界。并且集合视图数据源将被更改,因此包装器视图边界也会被更改。我用intrinsicContentSize
实现了包装器视图collectionView.collectionViewLayout.collectionViewContentSize
方法,并且集合视图布局是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];
在使用autolayout时,应该为包装器视图创建高度约束。然后,您可以将该约束的常量更改为等于集合视图内容大小,如下所示:
heightConstraint = make.height.equalTo(200) // initial height
然后您可以使用KVO来观察要更改和设置的集合视图内容大小
heightConstraint.constant = collectionView.contentSize.height
你可以参考这个来观察contentSize:observing contentSize (CGSize) with KVO in swift