2010-03-21 29 views
5

Aquí hay un problema del iPhone complicado en el que he estado trabajando. Tengo tres UIScrollViews en una página, uno que solo se desplaza horizontalmente, uno que solo se desplaza verticalmente y otro que se desplaza horizontal y verticalmente. Quiero bloquear las vistas, de modo que la ubicación horizontal de la vista de desplazamiento horizontal coincida con la ubicación horizontal de la vista de desplazamiento principal y la vista de desplazamiento vertical, de modo que arrastrar la vista de desplazamiento principal controle las vistas de desplazamiento horizontal y vertical.Conecta dos UIScrollView juntos

El problema es que estoy completamente perplejo. Miré dentro de la documentación de la manzana, pero parece que no hay forma de hacerlo oficialmente. Un pensamiento que tuve fue de alguna manera "clonar" cualquier toque en cualquiera de las vistas de desplazamiento a un punto en los otros dos, pero no tengo idea de cómo hacer esto. Si alguien tiene alguna idea sobre esto, lo apreciaría mucho.

Editar: Intenté la sugerencia de subclasificar UIScrollView y anular toquesMoved para llamar a touchesMoved en las otras vistas de desplazamiento. Desafortunadamente, touchesMoved no recibe el llamado para desplazarse por movimientos ya que UIScrollView intercepta esos movimientos de alguna manera y los usa para controlar su desplazamiento. Empecé a buscar más material de bajo nivel y encontré las capas de desplazamiento de animación principal, pero lo ideal sería no recrear UIScrollView desde cero. Todavía estoy tratando de resolver esto.

Respuesta

11

Creo que la forma más simple sería añadir un delegado a sus scrollviews que implementan el método siguiente:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

Luego puede verificar contentOffset para verificar cuánto se desplazó la vista de desplazamiento, y actualizar la vista de desplazamiento principal en consecuencia.

+0

Impresionante, esto funciona perfectamente. Me siento un poco tonto ahora, pero gracias por haberme aclarado. – johnw188

+0

Estoy atónito por la forma en que esto realmente funciona. Había pensado en ello, pero esperaba que los rebotes, etc., no se reflejaran y se viera repulsivo. Es perfecto. Gracias Martin! –

0

Necesita extender UIScrollView para los tres usos en su pantalla y anular los toquesMoved: withEvent: métodos para llamar a los otros (¡asegúrese de no terminar con un código circular que termine llamándose a sí mismo otra vez!).

Así, por ejemplo, el código en el elemento de desplazamiento bidireccional podría basarse en esto:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [horizontalScrollview touchesMoved:touches withEvent:event]; 
    [verticalScrollview touchesMoved:touches withEvent:event]; 
} 

mediante el uso de alguna variable adicional (por ejemplo ControllerLastTouched) se puede comprobar que antes de llamar a los otros dos touchesMoved: withEvent: métodos.

Esto le permitirá hacer la "clonación" de la que hablabas ...

+0

Oye, entonces pensé que esto era lo que estaba buscando, pero resulta que las cosas son un poco más complejas de lo que pensaba. Cuando configuré esta disposición, cualquier toque de la vista contenida dentro de UIScrollView se retiró, pero los movimientos de desplazamiento no llaman a touchesMoved. Estoy bastante seguro de que esto se debe a la forma en que funciona UIScrollView: inician un temporizador al tocar el dedo, y si la persona se desplaza dentro de una cierta cantidad de tiempo, comienza el desplazamiento, de lo contrario pasa el toque a los métodos de manejo táctil de la vista. – johnw188