Как предотвратить ручное масштабирование в UIScrollView - PullRequest
8 голосов
/ 16 января 2011

Надеюсь, кто-то может помочь с этой проблемой. У меня есть класс, производный от UIScrollView, и я бы хотел, чтобы пользователь не имел возможности масштабировать или прокручивать его с помощью ручных жестов. Вместо этого вся навигация по представлению будет управляться программными средствами в ответ на то, где пользователь нажимает (например, устройство для чтения электронных книг, при котором нажатие на левую или правую часть экрана приводит к прокрутке представления ровно на одну ширину страницы). Любые предложения о том, как это реализовать?

Ответы [ 5 ]

9 голосов
/ 13 апреля 2012

На вашем - (void)viewDidLoad; вы можете просто отключить любой распознаватель жестов, который вы хотите. В этом случае:

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

или

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

Иногда я делаю это из контроллеров представления, которые содержат UIScrollViews. Я просто нацеливаюсь на представление прокрутки (self.scrollView.pinchGestureRecognizer) и временно отключаю жесты при запуске приложения. находится в определенном состоянии.

7 голосов
/ 23 июля 2011

Чтобы предотвратить масштабирование и панорамирование пользовательского контроллера, но при этом разрешить программное масштабирование и панорамирование просмотра прокрутки, наилучшим подходом является переопределение метода -addGestureRecognizer: UIScrollView в подклассе. В моем использовании я хотел заблокировать все распознаватели и полностью контролировать видимую область с моего контроллера представления, я сделал это так:

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

Каждый распознаватель жестов просто отключен, для более точного управления (позволяя управлять панорамированием, но разрешать, например, масштабирование только двойным касанием), вы просто проверяете распознаватель входящих жестов с помощью -isKindOfClass: и отключаете его соответствующим образом.

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

Я использовал этот метод в приложении для чтения комиксов, которое использует управляемую навигацию для анимации между обрезанными панелями на странице с полной страницей, содержащейся в UIScrollView. Я могу плавно увеличивать и уменьшать масштаб выбранной области, просто устанавливая вид границы области, которую я хочу отобразить.

4 голосов
/ 26 февраля 2014

Быстрая заметка здесь.Кажется, UIScrollView panGestureRecognizer и pinchGestureRecognizer включены оба при первом добавлении контроллера вида в окно.

По сути, это означает, что они устанавливаются на enabled = NO в viewDidLoadне будет работать в некоторых случаях.Я переместил свой enabled = NO на viewWillAppear:, и он застрял.:)

1 голос
/ 06 марта 2014

В вашем подклассе UIScrollView перезаписывается также setZoomScale: метод, который автоматически повторно отключает жест

- (void)setZoomScale:(CGFloat)zoomScale {
    [super setZoomScale:zoomScale];
    self.pinchGestureRecognizer.enabled = NO;
}
1 голос
/ 16 января 2011

У меня нет большого опыта работы с UIScrollView s, но, глядя на документы, похоже, что вы можете установить maximumZoomScale, minimumZoomScale и scrollEnabled, чтобы отключить все, что вы хотите отключить.

Вот документы: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html

Из документов:

scrollEnabled:

Если значением этого свойства является ДА, прокрутка включена, и если это НЕТ , прокрутка отключена. По умолчанию это ДА.

Когда прокрутка отключена, прокрутка просмотр не принимает сенсорные события; Это направляет их вверх по цепочке респондента.

maximumZoomScale:

Это значение определяет, насколько велика содержание можно масштабировать. Это должно быть больше минимального масштаба для увеличения, чтобы быть включенным. По умолчанию значение 1,0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...