32

ビューがタッチまたはタップされると、そのハンドラーが最初に呼び出され、次にそのスーパービューのハンドラーが呼び出されると思いました(上に伝播します)。

しかし、スーパービューuserInteractionEnabledが NO に設定されている場合、すべてのサブビューと子孫もユーザー操作に対して無効になるというのは本当ですか? メイン ビューのみを無効にしたいが、サブビューを無効にしたくない場合はどうすればよいでしょうか。

4

4 に答える 4

29

これが役立つかもしれない場合、私はこれをMattNeuburgによるProgrammingiOS5で見つけました。467:

userInteractionEnabled

NOに設定すると、このビュー(およびそのサブビュー)はタッチの受信から除外されます。このビューまたはそのサブビューの1つに触れると、その背後にあるビューに「フォールスルー」します。

さらに、iOS用のAppleのイベント処理ガイドには次のように書かれています。

ウィンドウオブジェクトは、ヒットテストとレスポンダーチェーンを使用して、タッチイベントを受信するビューを見つけます。ヒットテストでは、ウィンドウはビュー階層の最上位のビューでhitTest:withEvent:を呼び出します。このメソッドは、YESを返すビュー階層内の各ビューでpointInside:withEvent:を再帰的に呼び出し、タッチが行われた境界内のサブビューが見つかるまで階層を下に進みます。そのビューがヒットテストビューになります。

マット・ノイブルクによるiOS 5のプログラミング、p.485は、ビューが、、またはとしてマークuserInteractionEnabledされている場合、または不透明度が0に近い場合、ビューとそのサブビューはトラバースされない(したがって、タッチの対象とは見なされない)と述べています。 。NOhiddenYESHitTest

更新:他のシナリオで親子の状況を考えると、このようにも機能すると思います。たとえば、HTMLで、divこの下にすべての子がありdiv、これdivがに設定されてdisplay: noneいる場合、すべての子も表示されないことは理にかなっています。したがって、親がユーザーと対話しないように設定されている場合、子もユーザーと対話しないことも理にかなっています。

于 2012-06-05T06:19:28.730 に答える
17

あなたはそれをすることはできません、

代わりに、次のようにビューの配置を変更します。

Main View -> subViews

Container View -> Main View that you want to set as inactive
               -> other views that you want to still be active

したがって、現在のメインビューと現在のサブビューは、新しいコンテナビューの子である兄弟になります。

于 2012-06-04T12:07:35.370 に答える
3

最初の方法

- (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];
于 2014-10-24T07:28:12.177 に答える