2011-12-09 4 views
1

現在、s.thを描画する必要があるアプリケーションに取り組んでいます。ネットワークグラフのように。残念ながら、このグラフは何千もの可動オブジェクトで非常に大きくなることがあります。iPad上のUIScrollViewでほぼ無限のグラフを描画するための最善のアプローチ

私は巨大なUIViewをUIScrollViewの中に入れようとしましたが、すぐにメモリの制限のために動作しないことに気付きました。 私は別のアプローチを試みました:現在私はUIScrollViewの可視部分のサイズを正確に持つUIViewを持っています。スクロールビューはスクロールを処理しないように設定されています(ピンチのみ)。代わりに私はUIViewのスクロールを処理します。ユーザーがスクロールするたびに、すべてのグラフィックオブジェクト(これらのグラフィックオブジェクトは現在、カスタム描画コードを含むNSObjectのサブクラスである)が移動されるため、ビューがスクロールしているように見えます。 drawRectでは、現在表示されているグラフィックだけを描画します。 また、サブレイヤが可視フレーム内に移動された場合、サブレイヤを追加して削除します。 これは何千ものオブジェクトでも非常にスムーズに動作します。

残念ながら、このアプローチはいくつかの欠点があります。

  • 私は、ユーザーがそれだけの一部

  • Iドンを見ることができる代わりに、グラフ内のすべてのオブジェクトを参照してくださいズームアウトすることはできません「がtはどちらかのグラフ内のすべてのオブジェクトがdraggであるため、動作しない、UIScrollViewのスクロール慣性がCATiledLayerのような私が試した

他のアプローチを提供しています取得します私がCATiledLayerを使用すると、実際には醜いように見えます。 ユーザーがスクロールしている間にUIViewを他のUIViewとスワップアウトすると、慣性スクロールに役立ちますが、すべてが複雑になり、完全にズームアウトすることはできません仕事:-(

非常に大きなグラフを描くためのベストプラクティスを知っていますか?

//編集:私は多くのサブレイヤを持つcascrolllayerを持つサブビューを持つuiscrollviewで終わった。 uiscrollviewsサブビューのフレームのズームインとズームアウトは、常にview.frame = scrollview.boundsのuiscrollviews境界に変更されます。スクロールビューをドラッグしている間、cascrolllayerは常にスクロールビューの現在のオフセットまでスクロールしなければなりません。 私はuiscrollviewをサブクラス化してズームをうまくやるためにハックする必要がありましたが、うまくいきました。このアプローチは非常にうまく動作し、多くのドラッグ可能な要素を持つ非常に大きなグラフを可能にします。

//編集:以下の私の他の回答を参照して、アプローチは、上記の私が最初に思った

答えて

0

CATiledLayerは、使用すべきか、間違いなく、特にズーム一環としてうまく機能しなかったここでは、そこではありません、本当に別巨大なズーム可能キャンバス上でQuartz/UIKit図面を使用できるようにするソリューションです。インタラクティブ(ドラッグまたはアニメーションなど)でなければならないものは、メインのタイルレイヤーでその表示を無効にし、その上に他のビューまたはレイヤーをオーバーレイすることができます。

+0

これは良いアイデアのように聞こえる、私はそれを試してみよう!ありがとう! – Nanunana

+0

残念ながら、これはうまくいかないと思います。私が遭遇した問題は、オーバーレイビューがメインビューとまったく同じサイズでなければならず、メインビューと同じサイズと位置にグラフィックスを表示するために同じスケーリングなどが必要であるということです。私はこれをどのように扱うべきかわかりません:-( – Nanunana

+0

Hey、CATiledLayerが最良の解決策であることが判明しましたが、知っておく必要があることは:タイルレイヤーに直接描画せず、タイルレイヤーにサブレイヤを追加するそれらを描くだけです。また、ズームする場合は、それらのサブレイヤの縮尺を変更するだけです。今非常にスムーズな作業。 – Nanunana

関連する問題