2012-03-18 7 views
6

私は、ビデオエディタのように、ある種のタイムラインビューを作成しようとしています:メディア要素が並んでいて、それはUIViewです。 touchesBegantouchesMovedのようなUIScrollViewのタッチイベントを使用して、スクロールビューの現在表示されている部分にこれらのビューを正常にドラッグできます。私は、スクロールビューのエッジの1つにサブビューをドラッグすると、スクロールビューをスクロールしたい。今私が考えることができる最高のは、ユーザーがスクロールビューのエッジの近くに指でサブビューを保持している間にビューをスクロールするタイマーを作成することです。UIScrollView内のビューをエッジの近くでスクロールしてドラッグするにはどうすればよいですか?

ここでは同じトピックについて多くの質問がありますが、スクロールをカバーするものは見つかりませんでした。

これを行うには良い方法がありますか?代わりにジェスチャ認識ツールを使用する必要がありますか?

ありがとうございます。

+0

「エッジゾーン」のインクリメント/デクリメントscrollOffSetにスクロールするようにする必要があります。 –

+0

これは私が今やっている方法ですが、結果が気に入らないので、アニメーションがぎこちなく、コードが信頼できないように見えます。なぜなら、それはタイマーに依存するからです。 – anticyclope

答えて

8

実際にあなたが望むのはタイムドイベントです。すぐに、ユーザーがスクロールビューの端に来ると、タイマーが開始され、定期的にcontentOffsetが増加します。アニメーションの結果が気に入らない場合は、setContentOffset:animated:を使用していると思います)、別のタイミングとアニメーションの距離を試してみてください。いくつかの異なる設定を試してみる必要があります。最初に試してみるのは一度に1ピクセルです。たぶん0.3秒ごと?

これでうまくいかない場合は、もう1つの「極端な」試みることもできます。ユーザーがエッジに達すると、単一のアニメーションを開始します。これにより、contentSizeの最後までcontentOffsetがアニメーション化されます。しかし、大きなタイムスパンでは動きが遅いです。ユーザーがドラッグを停止するか、エッジから移動する場合は、現在の位置でアニメーションを停止します。アニメーションはあなたのタイマーそのものなので、それはタイマーのない解決策でもあります。

+0

実際には、あなたが最初の段落(私の最初のアイデアでもあります)で説明した方法で既に実装しているので、今、この恩恵を受けることができます。主な問題は、サブビューがテーブルビューのセルのようにキャッシュされるため、スクロールビューのサブクラスにこの動作を統合することでした。とにかく、タイマーでも今は幸せです。 アニメーション中に、現在ドラッグされているビューの位置を更新する(スクロールビューがスクロールしている間はそのままにしておく)ように、回答にいくつかの点を追加できると思います。 – anticyclope

+0

実際にここで尋ねられる問題は、スクロールビュー内での実際のドラッグについてのものではなく、さまざまなアプローチがあります。私はここでの検索を参照します。その質問:http://stackoverflow.com/questions/9715582/iphone-ios-how-to-implement-drag-and-drop-for-subviews-of-a-scrollview/9844006#9844006 – calimarkus

+0

ドラッグは問題になりませんここでは、ビューを安定した状態に保ちますが、基礎となるスクロールビューはアニメーションでスクロールしていますが、まだ試していない可能性があります。 – anticyclope

0

ジェスチャー認識は、慎重なジェスチャーで最も役立つ傾向があるため、ジェスチャー認識がこの問題に対する良い解決策の一部となることを真剣に疑っています。

上記の暗黙の前提に基づいて、あなたの一般的な方向性を改善することはできませんが、あなたは連続的/段階的なスクロールを探しています。

代わりに、ページスクロールの手法を使用するように設計することをお勧めします。ユーザーがスクロールビューの端にオブジェクトをドラッグすると、スクロールビューがその方向に1ページ移動します(スクロールビューの境界に応じてその方向に移動するようにcontentOffsetを設定します)。それが起こっても、スクロールビューの端にある「ホットゾーン」からオブジェクトを少し動かすと、ユーザーは別のページやその行に沿ったものを明示的に表現する必要があります。デザインアプローチは、この "ページングイベント"に依存します。このページングイベントは、ユーザーがページングを維持するための何らかのジェスチャーシステムを実装する必要があります。

同じ状況でタイマーを使うことができると思いますので、ユーザーが位置を維持してもう1秒間タッチした場合は、再びページングします。

+1

thats勝つ..あなたはまだタイマーを持っている..あなたはビデオエディタを考えるなら、実際には非常に悪い解決策。ページングは​​本当にここでは役に立たないでしょう。ドラッグ状態にあるオブジェクトの位置を変更すると、悪いユーザーエクスペリエンスもあります... – calimarkus

+0

一部のジェスチャ認識機能は実際には正常です。長いプレスジェスチャ認識装置を使用すると、長いプレスが「キックイン」された後にドラッグすると位置更新が得られます。私はこれを使用して、長いプレスの一環としてドラッグを実装することに成功しています(つまり、長いプレスをしてから、長いプレスが認識されたらドラッグを開始する)。 – occulus

+0

ちょうど追加する - 私はこのアプローチをいくつかの時点で修正するかもしれない。弱いのは、ユーザーの指/ポインタが長いプレスの間にわずかでも動いても、それが長いプレスとして認識されないということである... – occulus

関連する問題