Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent manual zooming in a UIScrollView

Hopefully someone can help with this issue. I have a class derived from UIScrollView and I'd like to prevent the user from being able to zoom or scroll via manual pinch and swipe gestures. All view navigation will instead be controlled by programmatic means in response to where a user taps (think of an ebook reader where tapping on the left or right sides of the display causes the view to scroll by exactly one page width). Any suggestions on how to implement this?

like image 406
Shinohara Avatar asked Jan 16 '11 09:01

Shinohara


People also ask

What is contentOffset in ScrollView?

contentOffset ​Used to manually set the starting scroll offset. Type. Default. Point. {x: 0, y: 0}

What is Ui scroll view?

UIScrollView is the superclass of several UIKit classes, including UITableView and UITextView . A scroll view is a view with an origin that's adjustable over the content view. It clips the content to its frame, which generally (but not necessarily) coincides with that of the app's main window.


3 Answers

On your - (void)viewDidLoad; you should be able to just disable whatever gesture recognizer you want. In this case:

UIPinchGestureRecognizer *pinchRecognizer = self.pinchGestureRecognizer;
pinchRecognizer.enabled = NO;

or

UIPanGestureRecognizer *panRecognizer = self.scrollView.panGestureRecognizer;
panRecognizer.enabled = NO;

I sometimes do this from view controllers that contain UIScrollViews. I just target the scroll view (self.scrollView.pinchGestureRecognizer) and temporarily disable gestures when the app. is in a certain state.

like image 123
Joony Avatar answered Oct 08 '22 08:10

Joony


To prevent user-controller zooming and panning but still allow programmatic zooming and panning of a scrollview, the best approach is to override the UIScrollView's -addGestureRecognizer: method in a subclass. In my use I wanted to block all the recognizers and control the viewable area completely from my view controller, I did so like this:

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    //Prevent any of the default panning and zooming controls from working
    gestureRecognizer.enabled = NO;
    [super addGestureRecognizer:gestureRecognizer];
}

Each gesture recognizer is simply disabled, for finer control (allowing the pan control but only allow zooming via a double tap for instance) you'd simply check the incoming gesture recognizer via -isKindOfClass: and disabling as appropriate.

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    //Prevent zooming but not panning
    if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
        gestureRecognizer.enabled = NO;
    }
    [super addGestureRecognizer:gestureRecognizer];
}

I used this method in a comic reading app that uses guided navigation to animate between cropped panels on a page with the full page being contained in a UIScrollView.I can smoothly zoom in and out on a selected area by simply setting the view bounds to the region I want to display.

like image 36
Shinohara Avatar answered Oct 08 '22 07:10

Shinohara


A quick note here. It seems UIScrollView's panGestureRecognizer and pinchGestureRecognizer are both enabled the first time a view controller is added to a window.

Basically what that means is setting them to enabled = NO in viewDidLoad won't work in some cases. I moved my enabled = NO to viewWillAppear: and it stuck. :)

like image 4
Kenny Winker Avatar answered Oct 08 '22 06:10

Kenny Winker