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

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

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

最佳答案

您可以通过以下两种方法处理此问题:

  • 您可以使用 gestureRecognizerShouldBegin 中的 UIGestureRecognizerDelegate :
  • 指定您的视图控制器符合UIGestureRecognizerDelegate:
    @interface ViewController () <UIGestureRecognizerDelegate>
    
    ...
    
    @end
    
  • 指定您的视图控制器实际上是视图A的点击手势识别器的 delegate :
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tap.delegate = self;
    [self.viewA addGestureRecognizer:tap];
    
  • 编写gestureRecognizerShouldBegin,如果水龙头的位置包含在frameviewB中,则返回NO:
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gesture
    {
        CGPoint point = [gesture locationInView:self.viewB.superview];
    
        return !CGRectContainsPoint(self.viewB.frame, point);
    }
    
  • 您也可以将敲击手势子类化,并将其行为更改为立即失败(即,将状态直接更改为UIGestureRecognizerStateFailed)(如果敲击的位置与UITableView子视图重合)。
  • 您还可以仅向主视图添加一个子视图,该子视图仅覆盖表视图上方主视图的空间,然后向其中添加点击手势,这样您就不必处理任何重叠的手势识别器。
  • 关于ios - subview 在iOS7中不接收触摸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19207089/

    10-09 05:27
    查看更多