UITableView 和 UIView 手势冲突

UITableView and UIView gesture conflict

我正在尝试在 UIView 中添加 UITableView,但手势识别器出现问题。这是我的代码:

    _subView = [[UIView alloc] initWithFrame:CGRectMake(0, screenRect.size.height-100, screenRect.size.width, 300)];
    _subView.backgroundColor = [UIColor colorWithRed:0.110f green:0.192f blue:0.298f alpha:1.00f];

    [self.view addSubview:_subView];
     UITapGestureRecognizer *singleFingerTap =
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subViewToggle)];
    [_subView addGestureRecognizer:singleFingerTap];



_moreTable = [[UITableView alloc] initWithFrame:CGRectMake(0,50, screenRect.size.width, 240)];        
        //Transforme to HOR scroll ;
         CGRect frame = _moreTable.frame;
        _moreTable.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle);
        _moreTable.frame = frame;

        [_moreTable registerNib:[UINib nibWithNibName:@"MoreTableViewCell" bundle:nil] forCellReuseIdentifier:@"moreCell"];
        _moreTable.backgroundColor = [UIColor groupTableViewBackgroundColor];
        _moreTable.delegate = self;
        _moreTable.dataSource = self;
        [_subView addSubview:_moreTable];
        [_subView bringSubviewToFront:_moreTable];

问题是当我单击 table 单元格而不是执行 didSelectRowAtIndexPath 方法时,他执行了 subViewToggle 方法。我试着把我的 tableView 放在前面,但没用

你的点击手势吃掉了触摸。有两种交易方式:

首先,您可以实现 - gestureRecognizer:shouldReceiveTouch: 委托方法,并决定是否应该出现点击手势。

其次,你也可以将tap的cancelsTouchesInView 属性设置为NO,这样tableView才会接收到touch。但点击也会在某个时候收到触摸。

尝试实施 UIGestureRecognizerDelegate 协议的 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

这应该同时调用您的 didSelectRow 和 GestureRecognizer

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIGestureRecognizerDelegate/gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

请尝试这样使用

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view == _moreTable]) {

        return NO;
    }

    return YES;
}

为了解决这个问题,我将 UIView 手势从单指点击更改为 moveUP 和 moveDown 手势。 请注意,我只尝试了@dharmbir 解决方案,但对我没有用。

更新 此外,此解决方案实现了 shouldReciveTouches,适用于 tapGesture 和她的代码片段:

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   // UITableViewCellContentView => UITableViewCell
   if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
       return NO;
   }
   // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
   if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
       return NO;
   }
   return YES;
}
//Create tap gesture for menu transparent view
UITapGestureRecognizer *rightTableTransparentViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rightTableTransparentViewTapMethod:)];
[rightTableTransparentViewTap setCancelsTouchesInView:NO];
[_rightTableTransparentView addGestureRecognizer:rightTableTransparentViewTap];

- (void)rightTableTransparentViewTapMethod:(UITapGestureRecognizer *)recognizer {
    //Write your code here
}