简体   繁体   中英

UIPanGestureRecognizer on UITableViewCell overrides UITableView's scroll view gesture recognizer

I've subclassed UITableViewCell and in that class I apply a Pan gesture recogniser:

UIPanGestureRecognizer *panning = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanning:)];
panning.minimumNumberOfTouches = 1;
panning.maximumNumberOfTouches = 1;
[self.contentView addGestureRecognizer:panning];
[panning release];

I then implement the delegate protocol which is supposed to allow simultaneous gestures in the table's view:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

Then I place a log inside the handlePanning method just to see when it's detected:

- (void)handlePanning:(UIPanGestureRecognizer *)sender {
    NSLog(@"PAN");
}

My problem is that I'm not able to vertically scroll through the list of cells in the tableview and that handlePanning is called no matter which direction I pan.

What I want is for handlePanning to only be called when there is only horizontal panning and not vertical. Would appreciate some guidance.

Have you tried setting pannings delegate property?

panning.delegate = /* class name with the delegate method in it */;

You'll also need to conform that class to UIGestureRecognizerDelegate.

Subclass the panning gesture recognizer and make it recognize only horizontal panning. There is a great WWDC 2010 video on the issue of custom gesture recognizers available. Actually there are two on that subject, check them out at https://developer.apple.com/videos/archive/ :

  • Simplifying Touch Event Handling with Gesture Recognizers
  • Advanced Gesture Recognition

Add the gesture recogniser On tableview. From that, you can get the cell object. From there you can handle the cell Functionality. For each gesture, there will be a begin, changed, end state. So, store the begin position.

    CGPoint beginLocation = [gesture locationInView:tblView]; // touch begin state.

    CGPoint endLocation = [gesture locationInView:tblView]; // touch end state.

Using this point, you can get the IndexPath

    NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:beginPoint];

From this indexpath, you can access the cell.

            UITableViewCell *cell = [tableview cellForRowAtIndexPath : indexPath];

Using this Cell object, you can handle it.

您是否尝试将跳出属性设置为NO?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM