質問

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

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

  • UIView(コントローラーのビュー)
    • フレーム(0、0、300、300)を含むCustomView
    • フレーム付きの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を指すようにリターゲットされていないと思います。目的の効果を得るにはどうすればよいですか?

役に立ちましたか?

解決

hitTest:withEvent:を使用して、どのビューが「すべき」かを判断します。イベントを受信し、イベントを適切なビューに転送します。ボタンに移動する前にイベントを傍受するために少し踊り回らなければならないかもしれませんが、これがhitTest:withEvent:の目的です。

他のヒント

YESを返すには、 canBecomeFirstResponder をオーバーライドする必要があります。そうしないと、 becomeFirstResponder は何もしません。これは既に UIControl sで行われていますが、 UIView s

では行われていません
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top