Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 767
sooper Avatar asked Apr 17 '12 00:04

sooper


3 Answers

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.

like image 155
Jack Greenhill Avatar answered Oct 17 '22 03:10

Jack Greenhill


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
like image 41
Till Avatar answered Oct 17 '22 01:10

Till


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.

like image 23
Bharath Avatar answered Oct 17 '22 02:10

Bharath