セルはほとんどの場合同じ幅/高さであるため、/は機能しませんUICollectionView
。UITableView
最も重要なことは、セルの間隔が各セル間で常に同じであるということです。このため、インデックス範囲を簡単に計算し、インデックスにdataSource
基づいて必要なセルをクエリできます。
一方、タイムラインビューは、これらのコントロールとは大きく異なります。セル間の間隔は異なり、セルが互いに重なり合うことがあります。データソースを位置で並べ替えた場合でも、コントロールは範囲の検索を開始する場所を推測する必要があります。したがって、正しいインデックス範囲を見つけることはより費用がかかります-これをより短い時間で決定するには、適切なアルゴリズムを見つける必要があります。
をサブクラス化して、独自のコントロールを構築する必要がありますUIScrollView
。あなたはまったくいじる必要はないはずdrawRect
です。UITableView
とによって使用される重要な概念は、UICollectionView
セルのデキューです。AppleのPhotoScrollerのiOS5バージョンは、この概念をページングで示しています(iOS 6バージョンはカスタムページングをに置き換えますUIPageViewController
)。古いサンプルコードを入手するには、古いドキュメントをダウンロードする必要があります。
現在、タイムラインビューを作成しています。これは、いつかオープンソースになります。に基づいておりUITableView
、水平方向または垂直方向に機能します。のようにセルをデキューしUITableView
ます。私はラベルやスケーリングに焦点を当てていませんが、セル間の間隔に一貫性がないという概念に焦点を当てています。あなたに有利なスタートを与えるために、これが私が決めた私のdataSourceメソッドです:
- (NSInteger)numberOfCellsInTimelineView:(TimelineView *)timelineView;
- (CGRect)timelineView:(TimelineView *)timelineView cellFrameForIndex:(NSInteger)index;
- (TimelineViewCell *)timelineView:(TimelineView *)timelineView cellForIndex:(NSInteger)index;
UITableView
これらの呼び出しのうちの2つは、持っているものと同じですが、という新しい呼び出しがありcellFrameForIndex
ます。この呼び出しの重要な点は、TimelineViewがインデックスを推測し、セルのフレームを検索して、表示されている境界のどこに収まるかを確認できることです。表示されている境界内のセルを推測する場合は、エッジが見つかるまで前後に繰り返すだけです。
現在、私が使用しているアルゴリズムはround(count * (CGRectGetMidX(timelineView.bounds) / timelineView.contentSize.width))
(水平方向に)テイクします。基本的に、これはUIScrollViewの表示境界の中間点を取り、スクロールされたもののパーセンテージを取得します。次に、それをセルの数で乗算します。これはかなりうまく機能します。ランダムな間隔で100,000レコードのランダムなデータセットをテストする場合、呼び出しはcellFrameForIndex
8〜150の範囲でした。これで52〜60FPSを引き出すことができます。私はまだそれに取り組んでおり、インデックス範囲を決定するためのより良い/より速い方法を見つけようとしています。私はそれを目に見えるセル数+10(最大)反復に抑えようとしています。
待つ時間があれば、回答を更新して、完了したらGitHubプロジェクトへのリンクを含めます。これは、数日から1週間かかる場合があります。スケーリングを追加する場合があります。ただし、それをフォークして、ラベルやその他必要なものを追加する必要があります。
編集:
これが私のGithubプロジェクトです:https ://github.com/lukescott/TimelineView