2011-01-16 5 views
8

Esperemos que alguien pueda ayudar con este problema. Tengo una clase derivada de UIScrollView y me gustaría evitar que el usuario pueda acercarse o alejarse mediante los movimientos manuales de pellizcar y deslizar. Toda la navegación de la vista será controlada por medios programáticos en respuesta a los golpes del usuario (piense en un lector de libros electrónicos donde tocar en el lado izquierdo o derecho de la pantalla hace que la vista se desplace exactamente por un ancho de página). ¿Alguna sugerencia sobre cómo implementar esto?Cómo evitar el acercamiento manual en un UIScrollView

Respuesta

1

que no tienen demasiada experiencia con UIScrollView s, pero mirando a los documentos, parece que se puede establecer maximumZoomScale, minimumZoomScale y scrollEnabled desactivar todo lo que desea desactivar.

Éstos son los documentos: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html

A partir de los documentos:

scrollEnabled:

Si el valor de esta propiedad es SÍ, desplazamiento está activado, y si hay , el desplazamiento está deshabilitado. El valor predeterminado es SÍ.

Cuando el desplazamiento está deshabilitado, la vista de desplazamiento no acepta eventos táctiles; los reenvía a la cadena de respuesta.

maximumZoomScale:

Este valor determina el tamaño del contenido se puede escalar. Debe ser mayor que la escala de zoom mínima para habilitar el zoom. El valor predeterminado es 1.0.

+0

acabé descubriendo esto se hace mejor por la subclasificación de la ScrollView, y su sustitución por el método que se conecta un gesto Reconocedor a la vista. Al interceptar esto, puede verificar la clase del reconocedor de gestos que se adjunta y bloquear los reconocedores de gestos de pellizco y panorámica. Para el código que estaba escribiendo, quería evitar que los gestos usuales de pellizcar y desplazarse funcionen de modo que la navegación esté exclusivamente bajo control programático. Simplemente configuré la subclase heredada para nunca adjuntar reconocedores de gestos y luego mi código actuó en eventos táctiles recibidos por la subvista de la vista de desplazamiento. – Shinohara

+0

Hola, ¿tienes un ejemplo de este código? ¡Gracias! –

7

Para evitar que el usuario-controlador de zoom y panorámica, pero todavía permiten zoom programático y la panorámica de un ScrollView, el mejor enfoque es para anular el método de la UIScrollView -addGestureRecognizer: en una subclase. En mi uso que querían bloquear todos los reconocedores y controlar el área visible por completo de mi controlador de vista, lo hice así:

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

Cada reconocedor gesto es simplemente personas con discapacidad, para un control más fino (que permite el control de panorama pero solo permite hacer zoom con un doble toque, por ejemplo) simplemente verificas el reconocedor de gestos entrantes a través del -isKindOfClass: y deshabilitas según corresponda.

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

I utilizado este método en una aplicación de lectura de historietas que utiliza navegación para animar entre paneles recortadas en una página con la página completa guiado está contenida en un UIScrollView.I sin problemas se puede acercar y alejar en un área seleccionada por simplemente configurando los límites de la vista en la región que quiero mostrar.

+0

¿cómo se puede saber que Apple siempre usará un UIPinchGestureRecognizer aquí? ¿No es esta una forma incierta de lograr el objetivo? –

9

En su - (void)viewDidLoad; debería poder deshabilitar cualquier reconocedor de gestos que desee.En este caso:

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

o

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

veces hago esto desde los controladores de vista que contienen UIScrollViews. Simplemente apuntar a la vista de desplazamiento (self.scrollView.pinchGestureRecognizer) y deshabilitar temporalmente los gestos cuando la aplicación. está en cierto estado.

+4

El 'UIPinchGestureRecognizer' parece estar habilitado internamente configurando las escalas de zoom. Desactívelo * después de * configurarlos programáticamente. –

4

Una nota rápida aquí. Parece que UIScrollView's panGestureRecognizer y pinchGestureRecognizer están habilitados la primera vez que se agrega un controlador de vista a una ventana.

Básicamente lo que eso significa es configurarlos en enabled = NO en viewDidLoad no funcionará en algunos casos. Moví mi enabled = NO a viewWillAppear: y se bloqueó. :)

1

En la subclase UIScrollView sobrescribir también la setZoomScale: método que de nuevo automáticamente desactiva el gesto

- (void)setZoomScale:(CGFloat)zoomScale { 
    [super setZoomScale:zoomScale]; 
    self.pinchGestureRecognizer.enabled = NO; 
} 
Cuestiones relacionadas