touchesBegan、touchesMoved、touchesEnded を使用してタッチを処理する UIView サブクラスがあります。内部でタッチを開始してから UIView の外にドラッグすると touchesEnded がトリガーされないことに気付きました。UIView フレームの外にドラッグしているときにそれを呼び出す方法はありますか? ありがとう
3 に答える
おそらくそれは呼び出しています- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
UIResponderクラスリファレンスを確認してください
touchesCancelled:withEvent:
システムイベント(メモリ不足の警告など)がタッチイベントをキャンセルしたときに受信者に送信されます。
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
パラメーター
タッチ
A set of UITouch instances that represent the touches for the ending phase of the event represented by event. event An object representing the event to which the touches belong.
討論
このメソッドは、CocoaTouchフレームワークがタッチイベントのキャンセルを必要とするシステム中断を受信したときに呼び出されます。このために、UITouchPhaseCancelのフェーズを持つUITouchオブジェクトを生成します。中断は、アプリケーションがアクティブでなくなったり、ビューがウィンドウから削除されたりする原因となる可能性があります
オブジェクトがtouchesCancelled:withEvent:メッセージを受信すると、touchesBegan:withEvent:実装で確立された状態情報をクリーンアップする必要があります。
このメソッドのデフォルトの実装は何もしません。ただし、UIResponderの即時UIKitサブクラス(特にUIView)は、メッセージをレスポンダーチェーンの上位に転送します。メッセージを次のレスポンダーに転送するには、メッセージをsuper(スーパークラスの実装)に送信します。次のレスポンダーに直接メッセージを送信しないでください。例えば、
[super touchesCancelled:touches withEvent:event];
スーパー(一般的な使用パターン)を呼び出さずにこのメソッドをオーバーライドする場合は、スタブ(空の)実装としてのみ、タッチイベントを処理するための他のメソッドもオーバーライドする必要があります。可用性
Available in iOS 2.0 and later.
代わりに touchesCancelled を使用してください。
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
}
ビューのフレームの外にいてもtouchesMoved
、まだ入っているはずです。このビューが割り当てられているタッチ オブジェクトを保持し、次のロジックを実装するviewController
カスタムに配列を追加します。UIView
- 受け取ったら、タッチ座標が一致
touchesBegan
する特定の場所の配列にタッチオブジェクトを追加しますUIView
(すべてのサブビューを反復処理し、座標をフレームと一致させて正しいものを見つける必要がある場合があります) - 受け取ったら、以前の場所の配列
touchesMoved
からタッチを削除し、存在する場合は現在の場所UIView's
に追加しますUIView
- &
touchesEnded
-すべての配列touchesCancelled
からタッチを削除UIViews
カスタム UIView 配列からタッチ オブジェクトを削除または追加すると、デリゲート メソッドを呼び出すことができます (オブザーバー パターンを実装します)。1 つの配列に多くのタッチ オブジェクトが含まれている可能性があるため、デリゲートを呼び出す前に、最初のオブジェクトを追加したか最後のオブジェクトを削除したかを確認してください。
前回のゲームでそのようなソリューションを実装しましたが、代わりにUIViews
仮想ボタンがありました。