3

すべてのイベント(開始、移動、終了、キャンセル)CustomViewを独自に処理するUIViewサブクラス(この質問の目的で)があります。touches私はまた、それと重なるUIButton兄弟です。CustomView

たとえば、私のビュー階層は次のようになります。

  • UIView(コントローラーのビュー)
    • フレーム付きCustomView(0、0、300、300)
    • フレーム付きUIButton(0、0、100、50)

ユーザーがUIButtonからドラッグした後、CustomViewでタッチイベントをキャプチャしたいと思います。デバッグログから、UIControlEventTouchDragExitイベントがインターセプトするイベントであるように見えます(ただし、タッチがボタンから約100ピクセル離れるまで発生しませんが、この質問では重要ではありません)。

理想的には、ドラッグ終了イベントが発生すると、ボタンはタッチ移動イベントの受信を停止し、CustomViewはイベントを取得しtouchesBegan(何らかの方法で自分で偽造する必要がある場合でも)、今後のすべてのタッチイベント(touchesMovedなど)はに送信されます。 CustomView。

次のことを試しましたが、効果がありません。

-(void)btnTouchDragExit:(id)sender
{
    UIButton * btn = sender;
    [btn resignFirstResponder];
    [customView becomeFirstResponder];
}

UITouch基になるオブジェクト(タッチイベント全体で一貫している)は、CustomViewを指すようにリターゲットされていないと思います。どうすれば目的の効果を達成できますか?

4

2 に答える 2

5

hitTest:withEvent:を使用して、イベントを「受信する必要がある」ビューを特定し、イベントを適切なビューに転送します。ボタンに移動する前にイベントをインターセプトするために少し踊る必要があるかもしれませんが、これがhitTest:withEvent:の目的です。

于 2009-09-13T19:58:58.770 に答える
1

canBecomeFirstResponderYESを返すにはオーバーライドする必要があります。それ以外の場合becomeFirstResponderは何もしません。これはすでにsで実行されていますが、sUIControlでは実行されていませんUIView

于 2009-09-14T03:27:13.057 に答える