非常に興味深い -- XIB の標準的な rounded-rec UIButton。ビュー コントローラのメソッドにリンクされた touchUpInside があります。シミュレーターでは期待どおりに動作しますが、iOS 5 iPad では、リンクされたメソッド (cancelButtonPressed:) が呼び出される前にボタンを 2 秒間押し続ける必要があります。
ボタンのターゲット アクションを抽出してログに記録すると、実際に正しいターゲット オブジェクトとメソッドの touchUpInside イベントを探していることがわかります。
新しいターゲット メソッドに追加された (viewDidAppear 内の) アクションは、同じ動作を生成します。新しいメソッドは、ボタンが 2 秒間押された (そして離された) 場合にのみ呼び出されます。元のメソッドの直後に呼び出されます。
警告: もちろん、この設定は非常に厄介です。これは、メイン画面に浮かぶモーダル ビューです。ここに到達するために、VC のビューがロードされた後、VC とその元のビューの間にビューが挿入されました。
しかし、もちろん、シミュレーターではうまく機能します。(試したことはありませんが、おそらく iOS6 ハードウェアでも同様です。)
では、ボタンを 2 秒間押し続ける必要が生じる理由は何ですか? ボタンは、タッチするとすぐに「アニメーション化」(色が変わる) するため、単にタッチが伝播するのに長い時間がかかるわけではありません。
詳細:操作の順序
- 比較的普通のView Controllerを作成する
- 新しいUIViewを作成し、View Controllerのビューをこの新しいビューにし、VCの元のビューをサブビューとしてこの新しいビューに追加します
- 2 つのビューにタッチ ジェスチャ レコグナイザーを追加して、VC の元のビューの外側にあるタッチを認識できるようにします。(VC の元のビューに 1 つ追加されるため、そこでのタッチは無視できます。)
- 「通常のウィンドウ」に設定されたUIWindowを作成します
- 新しいウィンドウのルート ビュー コントローラーを上記のビュー コントローラーに設定する
makeKeyAndVisible
新しいウィンドウで。
(これにより、選択した VC で「ポップアップ ウィンドウ」が (ほぼ) 正常に作成されます。)
所見:
- ボタンは (色の変更によって) タッチに即座に応答するため、タッチ情報がビューにフィルター処理されるのに遅延はありません。
- ただし、ボタンのタッチは、ボタンを約 2 秒間押し続けた後にのみ有効であるため、単にタッチ イベントの配信が遅れているわけではありません。
- したがって、何かがタッチが発生したかどうかを決定するボタン固有のロジックに影響を与えているに違いありません。
あはは!
これを書いているときに、ジェスチャ認識機能が何らかの形で関与している可能性があることに気づきました。それらを無効にすると、問題はなくなりました。これらは UITapGestureRecognizer であり、ボタンの応答に影響を与えるべきではありません (考えられるでしょう) (ボックスの「外側」のタッチを検出するために、この同じスキームが他の場所で提唱されているため)。(ジェスチャ認識ハンドラはすぐに呼び出されます。)
(iOS 5 の「タッチ アウト ザ ボックス」機能を無効にできることを除けば、この知識があまり役に立たないというわけではありません。)