shouldReceiveTouch on UITableViewCellContentView

后端 未结 5 494
清歌不尽
清歌不尽 2020-12-31 07:27

I\'m trying to ignore UITapGestureRecognizer taps on a UITableView with the following:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer sho         


        
相关标签:
5条回答
  • 2020-12-31 07:48

    Here's the swift solution for the selected answer.

    I couldn't use the "MyTableView" named dependency check because I had a custom BaseViewController that many view controllers derive from. Some view controllers have a tableview, some have a collection view or both but in all cases the gesture recognizer steals their touches.

    I didn't want to put this gesture handling code in every subclass, so the only way I got it working in the base class is this:

    extension BaseViewController: UIGestureRecognizerDelegate {
    
        func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
            var view = touch.view
            while view != nil {
                if view!.isKindOfClass(UICollectionView) || view!.isKindOfClass(UITableView) {
                    return false
                } else {
                    view = view!.superview
                }
            }
            return true
        }
    
    }
    
    0 讨论(0)
  • 2020-12-31 07:48

    I think its clear and simpler to check touch region.

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                           shouldReceive touch: UITouch) -> Bool {
    
        let point = touch.location(in: viewContentContainer)
        return !tableRules.frame.contains(point)
    }
    
    0 讨论(0)
  • 2020-12-31 07:51

    I've just came across this problem, and the following solution works on all iOS versions, without having the risk of Apple changing the view hierarchy of the tableView. Basicaly, keep a reference to your UITableView:

     - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
          if([touch.view isDescendantOfView:detailsTableView]) {
              return NO;
          }
          return YES;
       }
    
    //isDescendantOfView:YES if the receiver is an immediate or distant subview of view or if view is the receiver itself; otherwise NO.
    
    0 讨论(0)
  • 2020-12-31 07:54

    You can do this.

        - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
        {
            if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
                return NO;
            }else{
                return YES;
            }
        }
    
    0 讨论(0)
  • 2020-12-31 08:04

    This seems to do it:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if([touch.view isKindOfClass:[UITableViewCell class]]) {
             return NO;
        }
        // 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; // handle the touch
    }
    
    0 讨论(0)
提交回复
热议问题