2011-01-16 4 views
8

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

ответ

1

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

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

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

scrollEnabled:

Если значение этого свойства YES, прокрутка включена, и если это не , прокрутка отключена. Значение по умолчанию - ДА.

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

maximumZoomScale:

Это значение определяет, насколько большой содержание может быть расширена. Он должен быть больше минимальной шкалы масштабирования для масштабирования для включения. Значение по умолчанию равно 1.0.

+0

Я в конечном итоге обнаружить это лучше всего сделать наследованием Scrollview, и заменяя метод, который крепит Жест Распознаватель представления. Перехватывая это, вы можете проверить класс прикрепляемого распознавателя жестов и заблокировать распознаватели жестов и поворота. Для кода, который я писал, я хотел, чтобы обычные жесты и жесты не работали, так что навигация была исключительно под программным контролем. Я просто устанавливаю унаследованный подкласс, чтобы никогда не добавлять распознаватели жестов, а затем мой код воздействовал на события касания, полученные подзапросом scrollview. – Shinohara

+0

Привет, у вас есть пример этого кода? Благодаря! –

7

Чтобы предотвратить пользовательский контроллер масштабирования и панорамирования, но все же позволяют программным масштабирование и панорамирование в Scrollview, лучший подход, чтобы переопределить метод -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.I может плавно увеличивать и уменьшать на выбранную области, просто устанавливая границы представления в область, которую я хочу отобразить.

+0

Как вы узнаете, что Apple всегда будет использовать здесь UIPinchGestureRecognizer? разве это не является неопределенным способом достижения цели? –

9

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

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

или

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

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

+4

«UIPinchGestureRecognizer», по-видимому, включен внутри, устанавливая масштаб масштабирования. Отключите его * после *, установив их программно. –

4

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

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

1

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

- (void)setZoomScale:(CGFloat)zoomScale { 
    [super setZoomScale:zoomScale]; 
    self.pinchGestureRecognizer.enabled = NO; 
} 
Смежные вопросы