我目前正在重构我的报亭应用。
以前,我在自动计算的网格布局中显示了几个自定义UIView
s(“CoverView”)(每行3个项目,根据需要包含多行),嵌入滚动视图中,垂直滚动。
每个“CoverView”由
组成每个CoverView都有自己的UITapGestureRecognizer
和UILongPressGestureRecognizer
。
如果用户点击一次,该按钮将被隐藏,下载进度条会显示并随着下载进度不断更新:
[issue addObserver:cover forKeyPath:@"downloadProgress" options:NSKeyValueObservingOptionNew context:NULL];
(长按识别器用于让用户删除问题)。
所有CoverView都存储在NSMutableDictionary中,并始终保存在内存中。虽然未缩放的图像相当大(1024像素高),但我在滚动时从未遇到过性能问题,可能因为没有那么多问题(因此也没有CoverViews)存储。
由于自行实现的网格布局复杂且难以维护,我想改用UICollectionView
。我添加了一个集合视图,并使我的CoverView类继承自UICollectionViewCell
(而不是UIView
)。
显示和滚动有效,但我遇到了这些问题:
当需要显示新的一行单元格并且 collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath :( NSIndexPath *)indexPath 时,每次都会调用滚动。
我试图不重复使用单元格(为了提高性能,奇怪的是),但由于每个单元必须具有重用标识符集(并且“reuseIdentifier”属性为readonly,所以我无法在代码中设置它。
我不知道在哪里取消KVO观察员的细胞。有没有办法在单元格排队等待重用后收到通知?
一般来说,我不确定我是否在这里滥用UICollectionView
我的具体用例,应该坚持我以前的方法,或者是否只是我无法有效地使用和调整UICollectionView
答案 0 :(得分:1)
要设置'reuseIdentifier',正确的设计是使用UICollectionView方法:
registerClass:forCellWithReuseIdentifier:
registerNib:forCellWithReuseIdentifier:
您通常会调用这些方法一次,具体取决于您希望如何提供单元格的实例化(从NIB中膨胀,或通过标准[[ViewClass alloc] init]
实例化
注册视图后,您可以在UiCollectionView中使用它们,如下所示:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"yourReuseId" forIndexPath:indexPath];
// Collection view handle ALL the work :
// 1 - retrieves a reusable view if views have already been recycled
// or 2- instantiate a new one, using the class/nib you registered
// So, cell SHOULDN'T be nil from here :)
// Note : from iOS 6, UITableView has a similar auto-instantiation mechanism
}
3 - 取消设置KVO,覆盖UICollectionViewCell
的{{1}}方法(继承自-(void)prepareForReuse
)