如何实现显示"有状态"内容的UICollectionViewCells?



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

以前,我在一个自计算的网格布局中显示了几个自定义的UIView("CoverView")(每行3个项目,必要时多行)嵌入在滚动视图中,垂直滚动。

每个"CoverView"由

组成
  • 标签(显示发行标题)
  • 图片(显示发行封面)
  • 一个按钮(显示"下载"或-如果已经下载-"阅读")
  • 进度条(最初隐藏,显示下载进度)

每个CoverView都有自己的UITapGestureRecognizerUILongPressGestureRecognizer

如果用户轻按一次,按钮隐藏,下载进度条显示并不断更新下载进度:

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

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

所有的coverview都存储在NSMutableDictionary中,并且总是保存在内存中。虽然未缩放的图像相当大(1024像素高),但我在滚动时从未遇到过性能问题,可能是因为没有那么多问题(因此也没有CoverViews)需要存储。

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

显示和滚动工作,但我有这些问题:

  1. 滚动是滞后的,当一个新的行单元格需要显示和collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath被调用。

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

  3. 我不知道在哪里为一个单元取消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)

相关内容

  • 没有找到相关文章

最新更新