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 部分和项目?