1

我有一个响应点击的 UIView(视图 A)。我有一个带有 UITableView(视图 B)的 UITableViewController。视图 B 作为子视图添加到视图 A,视图 B 的面积小于视图 A。因此,如果用户在视图 B 内点击,他们可以选择表格中的一行。如果他们在表格外点击但仍在视图 A 内,则视图 A 会做出不同的响应(它是一个隐藏自身的抽屉)。

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

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

4

1 回答 1

2

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

  1. 您可以gestureRecognizerShouldBegin使用UIGestureRecognizerDelegate

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

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

      UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
      tap.delegate = self;
      [self.viewA addGestureRecognizer:tap];
      
    • gestureRecognizerShouldBegin如果抽头的位置包含在frameof中,则写入返回 NO viewB

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

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

于 2013-10-06T09:58:39.773 回答