ビューがタッチまたはタップされると、そのハンドラーが最初に呼び出され、次にそのスーパービューのハンドラーが呼び出されると思いました(上に伝播します)。
しかし、スーパービューuserInteractionEnabled
が NO に設定されている場合、すべてのサブビューと子孫もユーザー操作に対して無効になるというのは本当ですか? メイン ビューのみを無効にしたいが、サブビューを無効にしたくない場合はどうすればよいでしょうか。
ビューがタッチまたはタップされると、そのハンドラーが最初に呼び出され、次にそのスーパービューのハンドラーが呼び出されると思いました(上に伝播します)。
しかし、スーパービューuserInteractionEnabled
が NO に設定されている場合、すべてのサブビューと子孫もユーザー操作に対して無効になるというのは本当ですか? メイン ビューのみを無効にしたいが、サブビューを無効にしたくない場合はどうすればよいでしょうか。
これが役立つかもしれない場合、私はこれをMattNeuburgによるProgrammingiOS5で見つけました。467:
userInteractionEnabled
NOに設定すると、このビュー(およびそのサブビュー)はタッチの受信から除外されます。このビューまたはそのサブビューの1つに触れると、その背後にあるビューに「フォールスルー」します。
さらに、iOS用のAppleのイベント処理ガイドには次のように書かれています。
ウィンドウオブジェクトは、ヒットテストとレスポンダーチェーンを使用して、タッチイベントを受信するビューを見つけます。ヒットテストでは、ウィンドウはビュー階層の最上位のビューでhitTest:withEvent:を呼び出します。このメソッドは、YESを返すビュー階層内の各ビューでpointInside:withEvent:を再帰的に呼び出し、タッチが行われた境界内のサブビューが見つかるまで階層を下に進みます。そのビューがヒットテストビューになります。
マット・ノイブルクによるiOS 5のプログラミング、p.485は、ビューが、、またはとしてマークuserInteractionEnabled
されている場合、または不透明度が0に近い場合、ビューとそのサブビューはトラバースされない(したがって、タッチの対象とは見なされない)と述べています。 。NO
hidden
YES
HitTest
更新:他のシナリオで親子の状況を考えると、このようにも機能すると思います。たとえば、HTMLで、div
この下にすべての子がありdiv
、これdiv
がに設定されてdisplay: none
いる場合、すべての子も表示されないことは理にかなっています。したがって、親がユーザーと対話しないように設定されている場合、子もユーザーと対話しないことも理にかなっています。
あなたはそれをすることはできません、
代わりに、次のようにビューの配置を変更します。
Main View -> subViews
に
Container View -> Main View that you want to set as inactive
-> other views that you want to still be active
したがって、現在のメインビューと現在のサブビューは、新しいコンテナビューの子である兄弟になります。
最初の方法
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE;
return TRUE;
}
2番目の方法
UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)];
r.cancelsTouchesInView = NO;
[agentPicker addGestureRecognizer:r];