2

iOS アプリケーションで、todo リストのようなズーム可能なタイムラインを作成したいと考えています。ズームインすると日と時間が表示され、ズームアウトすると日が折りたたまれたり、月にズームアウトしたりします。スクロール機能があります。

例として、次のように動作させたいと思います: http://almende.github.com/chap-links-library/js/timeline/doc/

必要なメモリをできるだけ少なくする必要があることを念頭に置いて、どのような種類の基本的なビューが適切な出発点になるでしょうか? UITableView、UIScrollView、または他の何かがこれで機能しますか?

4

2 に答える 2

8

セルはほとんどの場合同じ幅/高さであるため、/は機能しませんUICollectionViewUITableView最も重要なことは、セルの間隔が各セル間で常に同じであるということです。このため、インデックス範囲を簡単に計算し、インデックスに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レコードのランダムなデータセットをテストする場合、呼び出しはcellFrameForIndex8〜150の範囲でした。これで52〜60FPSを引き出すことができます。私はまだそれに取り組んでおり、インデックス範囲を決定するためのより良い/より速い方法を見つけようとしています。私はそれを目に見えるセル数+10(最大)反復に抑えようとしています。

待つ時間があれば、回答を更新して、完了したらGitHubプロジェクトへのリンクを含めます。これは、数日から1週間かかる場合があります。スケーリングを追加する場合があります。ただし、それをフォークして、ラベルやその他必要なものを追加する必要があります。

編集:

これが私のGithubプロジェクトです:https ://github.com/lukescott/TimelineView

于 2013-03-06T19:20:44.013 に答える
0

UITableViewは絶対に適していません。UIScrollViewより良いかもしれませんが、動的または非常に長いコンテンツにはあまり適していません。

最も簡単なアプローチは、自分ですべてを行うことだと思います-UIViewサブクラスで実装しますdrawRect. もちろん、それを使用UIPanRecognizerするのと同じ方法で使用する必要がありUIScrollViewます。

于 2013-03-06T17:29:48.350 に答える