2008-12-20 10 views
13

Uso UIScrollView para crear una IU de gran tamaño (más de 320 píxeles) en el iPhone.Cómo cancelar el desplazamiento en UIScrollView

Hice una instancia de UIScrollView y agregué algunas subvistas en ella. El problema es que quiero habilitar el desplazamiento solo cuando el usuario toca fuera de las subvistas, deja de desplazarse cuando el usuario toca una de las subvistas.

He leído documentos y he tratado de encontrar muestras, pero no puedo encontrar una buena pista. Si tiene alguna idea, por favor, ayúdenme.

+0

@Chris Hanson: ¿Por qué eliminaste iPhone y UIScrollView de las etiquetas? Esas son las etiquetas correctas, se puede agregar toque de cocoa, pero no debería estar solo aquí. – Emil

+0

No eliminé ni edité esas etiquetas :( –

+0

Porque cuando realicé esa edición, no fue una buena idea contaminar el espacio de etiquetas con nombres de clases e información redundante. Todavía no lo es, me di por vencido arreglando esa mierda –

Respuesta

5

Si desea detectar toques dentro de cualquiera de las subvistas de UIScrollView, tendrá que subclase UIScrollView y anular los métodos touchesShouldBegin y touchesShouldCancelInContentView que se crearon específicamente para este propósito.

Aparte de esto, no hay manera de que pueda identificar toques en las subvistas ya que UIScrollView tiende a manejar todos los toques y no los pasa a sus subvistas.

Todo lo mejor.

+0

Gracias por su respuesta. Traté de anular los métodos touchesShouldBegin/touchesShouldCancel ... pero nunca se invocaron estos métodos. Tal vez haya algún error en mi codificación, pero puedo dejar de desplazarme reemplazando los toquesBegin/touchesMoved/touchedEnded methods. ¡Gracias! –

+0

¿Lo estás haciendo en una subclase en UIScrollView? Los métodos serán llamados solo entonces. Entonces, en lugar de usar UIViewController como una vista de UIView, debería usar una subclase de UIScrollView como la vista – lostInTransit

+0

Sí, lo intenté en una subclase de UIScrollView. Obtuve algunos problemas en mi implemento (solo sobrepasé los toquesBegan ...), así que sigo tratando de encontrar la razón por la cual el método touchesShouldBegin nunca fue llamado. –

35

UIScrollView tiene una propiedad scrollEnabled que le permite desactivar el desplazamiento programáticamente. También tiene un delegado (UIScrollViewDelegate) que le permite ver eventos como desplazamiento de inicio/finalización. Parece que deberías poder cocinar algo con esas opciones combinadas de alguna manera.

+0

Gracias por su respuesta Voy a intentar su solución ahora –

+0

Esta es la mejor solución, @Stephen: usted es bueno :) – hungbm06

+2

Buena respuesta, vaga pero suficiente para empezar. +1 –

2

También puede subastrar UIScrollViewController y anular los métodos touchesBegan, touchesMoved y touchesEnded. Si su implementación nunca llama a la implementación de la superclase, entonces no se desplazará.

+0

Gracias por su respuesta. ¡Probé tu sugerencia y funcionó! –

4

La forma más sencilla de hacerlo es delayContentTouches en NO para scrollview. De esta forma, se establece el comportamiento predeterminado para que todo lo que sea un UIControl pase los toques al control inmediatamente y todo lo demás se desplazará.

+2

Si esto se establece en NO, el comportamiento es el opuesto al que desea OP. Si esto está establecido en SÍ, no es mucho mejor :) –

5

La propiedad que realmente le interesa - y en realidad estoy probando esto ahora, porque tengo el mismo problema que usted - es canCancelContentTouches.

Si el valor de esta propiedad es NO, la vista de desplazamiento no se desplaza independientemente del movimiento del dedo una vez que la vista de contenido inicia el seguimiento.

Si esto no te da los resultados que desea, UIScrollView subclase y reemplazar el método touchesShouldBegin:withEvent:inContentView, que es lo que sugiere la respuesta aceptada.

Cuestiones relacionadas