2011-01-13 23 views
2

UIScrollViewをループしたいのですが、ほとんどのループをビューのリストではなく、1つのサブビューをスクロールしてシームレスにループします。ルーピングUIScrollView水平方向

本質的に、マップビューを作成しようとしています。ズームインしたりズームアウトしたり、スクロールしたりすることができます。

誰もがヒントを得ましたか?

+0

[ワーキングサンプルプロジェクト](https://docs.google.com/leaf?id=0B7--XCpu3Or_MDAyNzU0MjktMjAxZS00NjQ1LTk3YzAtNGYzOGQwNTc4NjAy&hl=en) – Khrob

+0

エヴァー画像のための方法を考え出すないスクロールの端部の「スティック」へエリア? –

答えて

4

私はずっと前と同じ種類の問題で遊んでいて、1つの解決策のデモを一緒にハックしました。私は多くのタイルで構築されているかもしれないマップビューが管理しやすいかどうか分かりません。ここで

https://github.com/jonah-carbonfive/WrappingScrollView

は、私はそれがコードから明確でない場合にはやっているものです。

  1. 表示するコンテンツを含む単一のビューを作成します。これを「タイル表示」と呼びます。
  2. UIScrollViewのコンテンツビューの中央にタイルビューを表示します。コンテンツビューをタイルビューよりも大幅に大きくします(以下の参照)。
  3. タイルビューのコンテンツのイメージを作成します。
  4. この画像を含むUIImageView "タイル"を作成し、スクロールビューのコンテンツビューを満たすためにタイルビューの周りに配置します。それはUIImageViewsの多くかもしれませんが、メモリフットプリントがそれほど悪くないように、それらは単一のイメージを共有します。
  5. これで内容を少なくとも1回はラップするように見える大きなスクロールビューが表示されますが、十分にスクロールするとまだ端に当たっています。
  6. スクロールビューの-scrollViewDidScroll:デリゲートメソッドでは、タイルビューが完全に見えなくなっているかどうかを確認します。スクロールビューのコンテンツオフセットを変更してコンテンツビューの位置を変更し、表示領域の中央に戻します。タイルビューの画像を見ることからタイルビュー自体にジャンプしたことに気付かないことをユーザーは正しく認識しています。
  7. お待ちください!中央タイルビューだけが実際にタッチに反応します。それ以外のすべてのコピーは結局のところイメージです。これを回避するには、-hitTest:withEvent:をオーバーライドして、ユーザーがタッチしようとする画像ビューの代わりにタイルビューを移動してから、superを呼び出します。これですべてのタッチがタイル表示になります。
  8. タイルビューが再描画されるときはいつでも、タイルビューのイメージを更新してください。

これは夢中ですが、任意のインタラクティブなUIViewとUIControlをコンテナに投げ込み、片方を折り返してもう片方に折り返させることができます。


これはおそらくあなたにとって素晴らしい解決策ではありません。 1つ以上の次元でラップできるマップを描画したいとわかっていたら、マップを多くのタイルに分割します。 UIScrollViewのようにいくつかのコンテナビューでタッチを検出し、ユーザーがタッチを動かすとタイルの位置を変更します。視界からスクロールしてタイルを削除し、タイルを再利用してマップの新しく表示される領域を表示します。 単純なケースでは、マップイメージのコピーを2つだけ使用して実装できます。複雑なケースでは、UIScrollViewの多くを再作成しています。表示されているタイルを拡大縮小したり、さまざまな解像度で異なるタイルセットをロードしたりして、ズーム時にメモリ使用量を減らし解像度を向上させることができます。

+0

この質問は、おそらくKhrobが説明した機能の種類を処理する方法のより良い例です:http://stackoverflow.com/questions/3071623/make-uiscrollview-wrap-around – Jonah

+0

回答とリンクについては、ありがとうございました。その周りを遊んで、私はあなたが分離せずにUIScrollView内の別のページに当たる可能性を認識していませんでした。これはあなたのテクニックと組み合わせて、このトリックを行うようです。私はチャンスを得るとすぐにサンプルアプリを投稿します。 – Khrob

+0

OK、私が後にしている動作をかなり得ました。同じ画像で複数のサブビューを表示するのではなく、1つの画像を2倍にしました。 – Khrob

関連する問題