Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to recognize swipe gesture in UIScrollView

I'm trying to recognize left/right swipe gesture in a UIScrollView. I've tried to create UISwipeGestureRecognizers and associate them with the scroll view. It works but very rarely. Most of the time I do not get called. Why?

How can I reliably get swiping left/right to work? Can I use the gesture recognizers or do I have to somehow handle it myself in touchesBegan/Ended

Thanks

like image 885
David Avatar asked Sep 06 '10 04:09

David


1 Answers

Figured it out. In my case, my UIScrollView contained a UIImage that I allowed zooming. Apparently that meant that scrolling is enabled and the UIScrollView had trouble distinguishing between gestures intended to scroll vs. swipe (next, previous image).

The key in my case, is to disable scrolling in the scroll view when the image is not zoomed in, and renabled it when it is zoomed in. This provides the expected behavior.

The critical piece is to put the following in the scroll view's delegate:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {   if (scrollView.zoomScale!=1.0) {     // Zooming, enable scrolling     scrollView.scrollEnabled = TRUE;   } else {     // Not zoomed, disable scrolling so gestures get used instead     scrollView.scrollEnabled = FALSE;   } } 

I also have to initialize the scroll view with scrolling disabled. To enable zooming, simply provide an image on a delegate call,

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {   // Return the scroll view   return myImage; } 

And set a few parms in viewDidLoad for the zooming and setup gesture recognizers as well

- (void)viewDidLoad {   [super viewDidLoad];   myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height);   myScrollView.maximumZoomScale = 4.0;   myScrollView.minimumZoomScale = 1.0;   myScrollView.clipsToBounds = YES;   myScrollView.delegate = self;    [myScrollView addSubview:myImage];   [self setWantsFullScreenLayout:TRUE];    myScrollView.scrollEnabled = FALSE;    UISwipeGestureRecognizer *recognizer =      [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];   recognizer.delaysTouchesBegan = TRUE;   [myScrollView addGestureRecognizer:recognizer];   [recognizer release];    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];   recognizer.direction = UISwipeGestureRecognizerDirectionLeft;   [myScrollView addGestureRecognizer:recognizer];   [recognizer release];   [myScrollView delaysContentTouches]; } 
like image 149
David Avatar answered Sep 22 '22 15:09

David