現在、ニューススタンド アプリをリファクタリングしています。
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
) から継承させました。
表示とスクロールは機能しますが、次の問題があります。
セルの新しい行を表示する必要があり、collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPathがそれぞれに対して呼び出されると、スクロールが遅れます。
セルを再利用しないようにしました (奇妙なことに、パフォーマンスを向上させるために) が、各セルに再利用識別子を設定する必要があるため失敗しました(「reuseIdentifier」プロパティは読み取り専用であるため、コードで設定できません)。
セルの KVO のオブザーバーを設定解除する場所がわかりません。セルが再利用のためにキューに入れられたときに通知を受ける方法はありますか?
一般に、ここでの特定のユースケースで誤用UICollectionView
していて、以前のアプローチに固執する必要があるのか 、それともUICollectionView
.