子视图没有在iOS7中接收触摸

时间:2013-10-06 08:53:58

标签: ios objective-c uitableview ios7 uigesturerecognizer

我有一个响应水龙头的UIView(视图A)。我有一个UITableViewController与UITableView(视图B)。视图B作为子视图添加到视图A,视图B的区域小于视图A.因此,如果用户点击视图B内部,他们可以在表格中选择一行。如果他们在桌子外面但仍然在视图A内部,则视图A会以不同的方式响应(这是一个隐藏自己的抽屉)。

这在iOS 5和6中运行良好。但是,在iOS7中,View B(UITableview)似乎永远不会接收到触摸,并且行永远不会被选中,即使它是View A的子视图。当我禁用View时A的UITapGestureRecognizer,视图B然后开始获取触摸,用户可以选择表中的行(但是视图A现在不响应触摸因此这是不可接受的)

我的代码没有改变。关于iOS7中可能出现的问题的任何想法?提前谢谢!

1 个答案:

答案 0 :(得分:2)

您可以通过以下几种方式处理:

  1. 您可以使用gestureRecognizerShouldBeginUIGestureRecognizerDelegate

    • 将视图控制器指定为符合UIGestureRecognizerDelegate

      @interface ViewController () <UIGestureRecognizerDelegate>
      
      ...
      
      @end
      
    • 指定您的视图控制器实际上是视图A的点击手势识别器的delegate

      UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
      tap.delegate = self;
      [self.viewA addGestureRecognizer:tap];
      
    • 如果gestureRecognizerShouldBegin的{​​{1}}包含点击位置,请写frame,否则返回NO:

      viewB
  2. 如果点按的位置与- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gesture { CGPoint point = [gesture locationInView:self.viewB.superview]; return !CGRectContainsPoint(self.viewB.frame, point); } 子视图重合,您也可以将点击手势子类化,并立即将其行为更改为失败(即将状态直接更改为UIGestureRecognizerStateFailed

  3. 您还可以在主视图中添加一个子视图,它只覆盖表视图上方主视图的空间,然后将您的点击手势添加到该视图,这样您就不必处理任何重叠的手势识别器。