在 UicollectionViewCell 中更新 CollectionView 的大小
Posted
技术标签:
【中文标题】在 UicollectionViewCell 中更新 CollectionView 的大小【英文标题】:Update CollectionView´s size inside a UicollectionViewCell 【发布时间】:2014-07-09 23:19:43 【问题描述】:我正在努力解决一些需要解决的问题。
我正在制作一个带有 uicollectionview 的应用程序,其中的单元格可以在其中包含另一个 uicollectionview,依此类推。 单元格的大小是该单元格内 uicollectionview 的完整 contentSize。
想象一下我的应用中有这样的结构:
MainCollection
--Cell
...
--Cell_6
--ColectionviewA
--Cell
...
--Cell_66
-- CollectionViewB
--Cell_667
例如,Cell_667 的大小是从网络下载的异步图像大小的总动态手风琴大小。单元格下载为图像后,需要更新其大小。
当我发现我的问题时,我怎样才能告诉单元格的 “collectionview 父亲” 更新它的大小,然后建议是“父亲”更新大小,直到到达 MainCollection。
类似:
Cell_667(updateSizeCell) -> CollectionViewB(updateFrameSize) -> Cell_66(updateSizeCell) -> CollectionviewA (updateFrameSize) -> Cell_6(updateSizeCell)-> MainCollection(updatecontentSize)
目标是保持单个滚动。 我简单的解决方案是建议 MainCollection 重新加载所有单元格,但我想避免这种情况。知道如何让这种方式更高效、更干净吗?
任何提示将不胜感激。 提前致谢。
【问题讨论】:
【参考方案1】:您基本上要做的是找出集合视图的contentSize
何时发生变化。有几种方法可以做到这一点。
最直接的方法可能是使用 Key-Value Observing。
在初始化每个集合视图后,将观察者添加到它们,如下所示:
[myCollectionView addObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize)) options:0 context:nil];
然后,实现实际的观察方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
if([keyPath isEqualToString:NSStringFromSelector(@selector(contentSize))])
UICollectionView *updatedCollectionView = (UICollectionView *)object;
// update whatever you need to update here.
最后一点是记住在释放观察者时移除观察者(以防视图比观察者寿命更长)
[myCollectionView removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))];
如需了解更多信息,请查看the documentation 和Mattt Thompson's great post about it。
【讨论】:
但是还是有问题。我的 collectionView 更新它的 contentSize。单元格(拥有 collectionView 的人)如何知道需要更新其大小以适应与 collectionView 相同的大小? 你试过打电话给- (void)reloadItemsAtIndexPaths:(NSArray *)indexPaths
吗?然后传入内部集合视图的indexPath。
但是如果我改变单元格本身的大小,collectionView 的 contentSize 只会变得“更大”以上是关于在 UicollectionViewCell 中更新 CollectionView 的大小的主要内容,如果未能解决你的问题,请参考以下文章