1

( ) を持つ( ) の上に透明UIView( と呼びますreceiver) を重ねています。UIScrollViewscrollViewUIScrollViewDelegatescrollViewDelegate

状況によっては、receiver着地するタッチ イベントを消費する必要があります。他の方法では、いくつかの位置情報を収集してから、タッチ イベントをそのまま渡すか、scrollView代わりに、ドラッグの動きを構成し、適切な減速などをもたらすイベントをスプーフィングする必要があります。どうすればこれを達成できますか?


編集 - これまでの調査:

scrollViewDelegate's内にブレークポイントを配置しましたscrollViewWillBeginDragging。これにより、呼び出しシーケンスは次のようになります。

(...various calls filtering down from UIApplicationMain...)
[UIWindow sendEvent:]
[UIWindow _sendGesturesForEvent:]
...
[UIGestureRecognizer _delayedUpdateGesture:]
[UIGestureRecognizer _updateGestureWithEvent]
_UIGestureRecognizerSendActions
[UIScrollView handlePan:]
[UIScrollView _updatePanGesture]
....
[UIScrollViewDelegate scrollViewWillBeginDragging:]

理想的には、適切な情報で呼び出すことができるようにしたいのですがUIScrollView handlePan:、正しく呼び出す方法を詳しく説明しているものが見つかりませんhandlePan(可能である必要がある_UIGestureRecognizerSendActionsと思います)。

または、をサブクラス化できると思いますUIGestureRecognizerが、これはかなり手間のかかる方法のようです (また、一連のタッチ イベントを伝達する方法がわかりません)。

4

1 に答える 1

3

これを行う最も簡単な方法UIScrollViewは、レシーバーの内側に配置することです。

その後、次の 2 つのいずれかを実行できます。

  • イベントが配信されるべきではないことが事前にわかっている場合はuserInteractionsEnabled、スクロール ビューを に設定します。NO代わりに、イベントはレシーバー ビューに配信されます。

  • hitTest:withEvent:着信イベントに注意するためにオーバーライドします。それらをスケルチするには、レシーバーを返すだけです (これらのイベントのターゲットであることを示します)。それらを渡すには、スーパーの実装から値を返します (適切な場合、スクロール ビューをターゲットとして正しく識別します)。

イベントを合成する必要がある場合は、イベントを作成してUIApplication- (void)sendEvent:メソッドに渡すことができます。handlePan:(直接呼び出すのはおそらくうまくいきませんUIGestureRecognizer。偽造するのは難しいからです。)

于 2012-08-06T14:25:45.547 に答える