2012-03-18 11 views
6

Estoy intentando crear una especie de vista de línea de tiempo como en los editores de video: elementos de medios en una fila, que son UIView. Puedo arrastrar con éxito estas vistas dentro de la parte actualmente visible de la vista de desplazamiento usando eventos táctiles UIScrollView como touchesBegan y touchesMoved. Deseo desplazar la vista de desplazamiento una vez que la vista secundaria se haya arrastrado a uno de los bordes de la vista de desplazamiento. Lo mejor que se me ocurre ahora es crear un temporizador que recorra la vista mientras el usuario sostiene la subvista con el dedo cerca del borde de la vista de desplazamiento.¿Cómo arrastrar una vista dentro de UIScrollView con desplazamiento cerca de los bordes?

Aquí hay muchas preguntas sobre el mismo tema, pero no pude encontrar una que cubra el desplazamiento.

¿Hay una buena manera de hacerlo? ¿Debo usar reconocedores de gestos en su lugar?

Gracias de antemano.

+0

puede obtener la ubicación del toque y si está en la "zona de borde" incrementar/disminuir scrollOffSet, debe hacer que parezca desplazarse –

+0

Así es como estoy haciendo ahora, pero no me gusta el resultado, la animación es desigual y el código no parece confiable, porque depende de los temporizadores. – anticyclope

Respuesta

8

Actualmente, lo que usted quiere es un evento programado. Tan pronto como el usuario esté en el borde de la vista de desplazamiento, iniciará un temporizador, que aumenta regularmente el contentOffset. Si no le gustan los resultados de la animación (supongo que está usando setContentOffset:animated:?), Pruebe con otro tiempo y distancia de animación. Supongo que debe probar algunas configuraciones diferentes. Lo que probaría primero es 1px a la vez. Tal vez cada 0.3 segundos?

Si eso no funciona, también podría intentar otro "extremo". Comience una sola animación, cuando el usuario llegue al borde, que anima el contentOffset hasta el final del contentSize. Pero durante un período de tiempo grande, el movimiento es lento. Si el usuario detiene el arrastre o se mueve fuera del borde, detenga la animación en la posición actual. Eso incluso sería una solución sin un temporizador, porque la animación sería su propio temporizador.

+0

En realidad, tengo que cerrar esta recompensa en este momento, ya que ya lo he implementado de la manera que describes en el primer párrafo (que también es mi primera idea). El problema principal fue integrar este comportamiento en mi subclase de vista de desplazamiento, ya que sus subvistas se almacenan en caché como celdas en vistas de tabla. De todos modos, ahora estoy feliz incluso con temporizadores. Creo que puede agregar algunos puntos a su respuesta, por ejemplo, cómo actualizar la posición de la vista arrastrada actualmente (para mantenerla debajo del dedo mientras scrollview se desplaza) durante la animación, por lo que la respuesta estará completa y el premio será suyo :) – anticyclope

+0

En realidad, el problema que se plantea aquí no se trata del arrastre real dentro de una vista de desplazamiento: hay diferentes enfoques. Me referiría a la búsqueda aquí, o p. esa pregunta: http://stackoverflow.com/questions/9715582/iphone-ios-how-to-implement-drag-and-drop-for-subviews-of-a-scrollview/9844006#9844006 – calimarkus

+0

Arrastrar está fuera de cuestión aquí, pero mantener la vista estable, mientras que la vista de desplazamiento subyacente se desplaza con animaciones no está claro para mí, posiblemente porque aún no lo intenté. – anticyclope

0

Tengo serias dudas de que los reconocedores de gestos sean parte de una buena solución para esto, ya que tienden a ser más útiles con gestos discretos.

No creo que pueda mejorar su dirección general en base a la suposición, implícita anteriormente, de que está buscando un desplazamiento continuo/gradual.

Lo que sugiero en su lugar es que considere diseñar esto para utilizar un enfoque de desplazamiento con paginación. Cuando el usuario arrastra el objeto al borde de la vista de desplazamiento, hace que la vista de desplazamiento se mueva una página en esa dirección (configurando contentOffset para moverse en esa dirección según los límites de la vista de desplazamiento). Cuando eso ocurra, mueva el objeto ligeramente fuera de la "zona caliente" en el borde de la vista de desplazamiento para que el usuario se vea obligado a expresar explícitamente que desea mover otra página, o algo similar, es decir, dado que El enfoque de diseño depende de estos "eventos de búsqueda" que necesita para implementar algún tipo de sistema gestual para que el usuario siga buscando.

Supongo que podría utilizar un temporizador en esa misma situación, de modo que si el usuario mantiene la posición y toca durante otro segundo, volvería a abrir la página.

+1

eso no es ganar ... y todavía tienes un temporizador ... en realidad es una solución bastante mala, si piensas en un editor de video. la búsqueda no ayudaría mucho aquí. También es una mala experiencia del usuario, si reposicionas un objeto, que está en un estado de arrastre ... – calimarkus

+0

Algunos reconocedores de gestos están realmente bien. Si usa un reconocedor de gestos de pulsación larga, obtendrá actualizaciones de posición si arrastra después de que la pulsación larga haya sido activada. Estoy usando esto con éxito para implementar el arrastre como parte de una pulsación larga (es decirhaga una pulsación larga, luego comience a arrastrar una vez que se haya reconocido la pulsación larga). – occulus

+0

Solo para agregar: puedo revisar este enfoque en algún momento, ya que una debilidad es que si el dedo/puntero del usuario se mueve ligeramente durante la pulsación larga, no se reconoce como una pulsación larga ... – occulus

Cuestiones relacionadas