0

我目前正在重构我的报亭应用程序。

以前,我在UIView嵌入在滚动视图中的自计算网格布局(每行 3 个项目,行数根据需要)中显示了几个自定义 s(“CoverView”),垂直滚动。

每个“CoverView”包括

  • 标签(显示问题标题)
  • 图片(显示问题封面)
  • 一个按钮(显示“下载”或 - 如果已下载 - “阅读”)
  • 进度条(最初隐藏,显示下载进度)

每个 CoverView 都有自己的UITapGestureRecognizerUILongPressGestureRecognizer.

如果用户点击一次,按钮会被隐藏,下载进度条会显示并随着下载进度不断更新:

 [issue addObserver:cover forKeyPath:@"downloadProgress" options:NSKeyValueObservingOptionNew context:NULL]; 

(长按识别器用于让用户删除问题)。

所有 CoverView 都存储在 NSMutableDictionary 中,并且始终保存在内存中。尽管未缩放的图像相当大(1024 像素高),但我在滚动时从未遇到过性能问题,可能是因为存储的问题(以及 CoverViews)并不多。

由于自行实现的网格布局复杂且难以维护,因此我想使用 aUICollectionView来代替。我添加了一个集合视图并使我的 CoverView 类继承自UICollectionViewCell(而不是UIView)。

显示和滚动有效,但我遇到了这些问题:

  1. 当需要显示新的单元格行并为每个单元格调用collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath时,滚动会滞后。

  2. 我试图不重用单元格(以提高性能,很奇怪),但这失败了,因为每个单元格都必须设置它的重用标识符(并且“reuseIdentifier”属性是只读的,所以我不能在代码中设置它)。

  3. 我不知道在哪里为单元格取消设置 KVO 的观察者。一旦一个单元被排队等待重用,有没有办法得到通知?

一般来说,我不确定我是否在UICollectionView这里误用了我的特定用例,应该坚持我以前的方法,还是只是我无法有效地使用和调整UICollectionView.

4

1 回答 1

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-(void)prepareForReuse方法(继承自UICollectionReusableView

于 2013-02-28T14:39:48.993 回答