when how appears iphone objective-c ios uiscrollview

iphone - how - Haciendo dos UIScrollViews siguen el desplazamiento de cada uno



scrollview textfield swift (2)

Establezca el delegado de la vista de desplazamiento A para que sea su controlador de vista ... luego tenga ...

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGPoint offset = scrollViewB.contentOffset; offset.y = scrollViewA.contentOffset.y; [scrollViewB setContentOffset:offset]; }

Si desea que ambos se sigan, configure delegado para ambos y use ...

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if([scrollView isEqual:scrollViewA]) { CGPoint offset = scrollViewB.contentOffset; offset.y = scrollViewA.contentOffset.y; [scrollViewB setContentOffset:offset]; } else { CGPoint offset = scrollViewA.contentOffset; offset.y = scrollViewB.contentOffset.y; [scrollViewA setContentOffset:offset]; } }

Se puede refactorizar lo anterior para tener un método que tome dos vistas de desplazamiento y coincida una con la otra.

- (void)matchScrollView:(UIScrollView *)first toScrollView:(UIScrollView *)second { CGPoint offset = first.contentOffset; offset.y = second.contentOffset.y; [first setContentOffset:offset]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if([scrollView isEqual:scrollViewA]) { [self matchScrollView:scrollViewB toScrollView:scrollViewA]; } else { [self matchScrollView:scrollViewA toScrollView:scrollViewB]; } }

Versión Swift 3:

func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView == scrollViewA { self.synchronizeScrollView(scrollViewB, toScrollView: scrollViewA) } else if scrollView == scrollViewB { self.synchronizeScrollView(scrollViewA, toScrollView: scrollViewB) } } func synchronizeScrollView(_ scrollViewToScroll: UIScrollView, toScrollView scrolledView: UIScrollView) { var offset = scrollViewToScroll.contentOffset offset.y = scrolledView.contentOffset.y scrollViewToScroll.setContentOffset(offset, animated: false) }

¿Cómo puedo hacer que dos vistas de desplazamiento sigan el desplazamiento de cada una?

Por ejemplo, tengo una vista de desplazamiento (A) a la izquierda de una pantalla, cuyo contenido puede desplazarse hacia arriba y hacia abajo, pero no a la izquierda ni a la derecha. La vista de desplazamiento B coincide con la parte superior y inferior de A, pero también puede desplazarse hacia la izquierda y hacia la derecha. La vista de desplazamiento A está siempre en la pantalla.

----------------------------------------------------------- | | | | | | | | | | A | B | | | | | scrolls | | | up & down | scrolls all directions | | | | -----------------------------------------------------------

¿Cómo lo haría para que el desplazamiento hacia arriba y hacia abajo (de cualquiera de las vistas) también haga que la otra vista se desplace en la misma dirección de arriba a abajo? ¿O hay otro método para hacer esto?


Probé la respuesta de Simon Lee en iOS 11. Funcionó pero no muy bien. Las dos vistas de desplazamiento se sincronizaron, pero al usar su método, las vistas de desplazamiento perderían el efecto de inercia (cuando continúe desplazándose después de que suelte el dedo) y el efecto de rebote. Creo que se debió al hecho de que configurar el contentOffset mediante setContentOffset(offset, animated: false) provoca llamadas cíclicas del método del delegado scrollViewDidScroll(_ scrollView: UIScrollView) (ver esta pregunta )

Aquí está la solución que me funcionó en iOS 11:

// implement UIScrollViewDelegate method func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView == self.scrollViewA { self.syncScrollView(self.scrollViewB, toScrollView: self.scrollViewA) } else if scrollView == self.scrollViewB { self.syncScrollView(self.scrollViewA, toScrollView: scrollViewB) } } func syncScrollView(_ scrollViewToScroll: UIScrollView, toScrollView scrolledView: UIScrollView) { var scrollBounds = scrollViewToScroll.bounds scrollBounds.origin.y = scrolledView.contentOffset.y scrollViewToScroll.bounds = scrollBounds }

Entonces, en lugar de configurar contentOffset , estamos utilizando la propiedad de bounds para sincronizar el otro scrollView con el que fue desplazado por el usuario. De esta manera, el método delegado scrollViewDidScroll(_ scrollView: UIScrollView) no se denomina cíclicamente y el desplazamiento se realiza de manera muy suave y con efectos de inercia y rebote como con una vista de desplazamiento único.