0

現在、ニューススタンド アプリをリファクタリングしています。

UIView以前は、垂直方向にスクロールするスクロール ビューに埋め込まれた自己計算グリッド レイアウト (1 行あたり 3 項目、必要な数の行)でいくつかのカスタムs (「CoverView」) を表示していました。

各「CoverView」は、

  • ラベル (問題のタイトルを表示)
  • 画像(号の表紙を表示)
  • ボタン (「DOWNLOAD」または - 既にダウンロードされている場合は「READ」と表示)
  • 進行状況バー (最初は非表示で、ダウンロードの進行状況が表示されます)

各 CoverView には独自のUITapGestureRecognizerとがありUILongPressGestureRecognizerます。

ユーザーが 1 回タップすると、ボタンが非表示になり、ダウンロードの進行状況バーが表示され、ダウンロードの進行状況が常に更新されます。

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

(長押し認識機能は、ユーザーが課題を削除できるようにするために使用されます)。

すべての CoverView は NSMutableDictionary に格納され、常にメモリに保持されます。スケーリングされていない画像はかなり大きい (高さ 1024 ピクセル) ですが、スクロール中にパフォーマンスの問題が発生したことはありません。

UICollectionView自己実装のグリッド レイアウトは複雑で保守が難しいため、代わりにa を使用したいと考えました。コレクション ビューを追加し、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 から拡張するか、標準でインスタンス化するか) に応じて 1 回呼び出します。[[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 に答える