aka*_*aru 34 ios6 uicollectionview
我有一些数据是在另一个更新UICollectionView标头的线程中获取的.但是,我没有找到一种重新加载补充视图(如页眉或页脚)的有效方法.
我可以打电话collectionView reloadSections:,但这会重新加载整个部分,这是不必要的.collectionView reloadItemsAtIndexPaths:似乎只针对细胞(不是补充观点).并且调用setNeedsDisplay标题本身似乎也不起作用.我错过了什么吗?
Sar*_*den 26
你也可以使用(懒惰的方式)
collectionView.collectionViewLayout.invalidateLayout() // swift
[[_collectionView collectionViewLayout] invalidateLayout] // objc
Run Code Online (Sandbox Code Playgroud)
更复杂的是提供背景
collectionView.collectionViewLayout.invalidateLayout(with: context) // swift
[[_collectionView collectionViewLayout] invalidateLayoutWithContext:context] // objc
Run Code Online (Sandbox Code Playgroud)
然后,您可以自己创建或配置上下文以通知应更新的内容,请参阅:UICollectionViewLayoutInvalidationContext
它有一个功能,您可以覆盖:
invalidateSupplementaryElements(ofKind:at:) // swift
Run Code Online (Sandbox Code Playgroud)
Bob*_*ork 10
我刚遇到同样的问题,最后我用标签查找视图来编辑标签:
UICollectionReusableView *footer = (UICollectionReusableView*)[self.collectionView viewWithTag:999];
UILabel *footerLabel = (UILabel*)[footer viewWithTag:100];
Run Code Online (Sandbox Code Playgroud)
就像你说的那样,没有必要重新加载整个部分,这也取消了细胞上的任何动画.我的解决方案并不理想,但它很容易.
斯威夫特 3/4/5版本:
collectionView.collectionViewLayout.invalidateLayout()
Run Code Online (Sandbox Code Playgroud)
警告!
如果您同时更改collectionView项目数(例如,仅当所有单元格都已加载时才显示页脚),它将崩溃。您需要先重新加载数据,以确保之前和之后的项目数相同invalidateLayout():
collectionView.reloadData()
collectionView.collectionViewLayout.invalidateLayout()
Run Code Online (Sandbox Code Playgroud)
小智 2
您可以通过以下两种方法来做到这一点。
1. 创建一个可变模型来支持最终可用的数据。在 UICollectionReusableView 的继承类中使用 KVO 来观察更改并在新数据可用时使用新数据更新标题视图。
[model addObserver:headerView
forKeyPath:@"path_To_Header_Data_I_care_about"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:NULL];
Run Code Online (Sandbox Code Playgroud)
然后在标题视图中实现监听器方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
Run Code Online (Sandbox Code Playgroud)
2. 将通知侦听器添加到视图,并在数据成功可用时发布通知。缺点是它的应用范围很广,而且设计不干净。
// place in shared header file
#define HEADER_DATA_AVAILABLE @"Header Data Available Notification Name"
// object can contain userData property which could hole data needed.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(headerDataAvailable:) name:HEADER_DATA_AVAILABLE object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:HEADER_DATA_AVAILABLE object:nil];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26684 次 |
| 最近记录: |