転送方法“あるUIViewから別のUIViewへの最初のレスポンダー?
-
07-07-2019 - |
質問
すべての 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