我目前正在重构我的报摊应用程序。
以前,我在一个自计算的网格布局中显示了几个自定义的UIView
("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"属性是只读的,所以我不能在代码中设置它)。
我不知道在哪里为一个单元取消KVO的观察者。是否有一种方法被通知,一旦一个细胞得到队列重用?
总的来说,我不确定我是否在这里滥用UICollectionView
与我的特定用例,应该坚持我以前的方法,或者它是否只是我无法有效地使用和调整UICollectionView
。
要设置'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
的-(void)prepareForReuse
方法(继承自UICollectionReusableView
)