soporte apple iphone ios uiscrollview uicollectionview uiscrollviewdelegate

apple - manual iphone 6s pdf



Desplazamiento manual de dos UICollectionViews que muestran el mismo contenido (2)

Como sugiere el título, tengo un UIViewController con dos UICollectionViews que muestran el mismo contenido de forma horizontal. El principal muestra una foto a la vez, el pulgar uno muestra varios.

He anulado el método UIScrollViewDelegate y he agregado un código para que cuando el usuario se desplaza por el CV principal, la CV de los pulgares también se desplaza. Sin embargo, me gustaría habilitar lo opuesto también (desplazar los pulgares que moverán rápidamente el principal). Sin embargo, estoy obteniendo un efecto de retroalimentación.

Aquí está mi fragmento de código:

#pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(scrollView == self.mainCollectionView){ CGFloat x = self.mainCollectionView.contentOffset.x / self.mainCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.thumbsCollectionView.contentOffset = contentOffset; } else if(scrollView == self.thumbsCollectionView){ // CGFloat x = self.thumbsCollectionView.contentOffset.x / self.thumbsCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 // CGFloat y = 0; // CGPoint contentOffset = CGPointMake(x, y); // self.mainCollectionView.contentOffset = contentOffset; } }

Me imagino que puedo rastrear los eventos de tocar abajo / arriba para enmascarar lo que está permitido que suceda, pero antes de intentarlo pensé que vería si hay una manera diferente de hacer esto. ¿Estoy pasando por alto un método proporcionado que me ayudará aquí?

Gracias.

Edición: solución. Había un método UIScrollViewDelegate que proporcionaba lo que necesitaba para rastrear qué diseño se estaba tocando. Código actualizado:

#pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(scrollView == self.mainCollectionView && self.scrollingView == self.mainCollectionView){ CGFloat x = self.mainCollectionView.contentOffset.x / self.mainCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.thumbsCollectionView.contentOffset = contentOffset; } else if(scrollView == self.thumbsCollectionView && self.scrollingView == self.thumbsCollectionView){ CGFloat x = self.thumbsCollectionView.contentOffset.x / SM_IPHONE_THUMB_CONTAINER_SIZE * self.mainCollectionView.frame.size.width; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.mainCollectionView.contentOffset = contentOffset; } } -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ self.scrollingView = scrollView; }


Mantenga un registro de la vista de desplazamiento que se está arrastrando actualmente cuando se llama a scrollViewWillBeginDragging:

En scrollViewDidScroll: actualice la vista de desplazamiento que no se está arrastrando:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(scrollView == self.mainCollectionView && self.mainCollectionView == self.scrollingView){ // new check CGFloat x = self.mainCollectionView.contentOffset.x / self.mainCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.thumbsCollectionView.contentOffset = contentOffset; } else if(scrollView == self.thumbsCollectionView && self.thumbsCollectionView== self.scrollingView){ // new check CGFloat x = self.thumbsCollectionView.contentOffset.x / self.thumbsCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.mainCollectionView.contentOffset = contentOffset; }


Usa delegados. Subclase the CollectionView e implemente el selector de scrollViewDelegate scrollViewDidScroll :. También crea una nueva propiedad llamada

id scrollDistanceDelegate;

Ahora crea tu propio protocolo en las subclases CollectionView. Se llamará a este protocolo cuando se desplaza una vista de desplazamiento y enviará la distancia en la que se desplazó. Entonces el selector de protocolo podría ser:

scrollView: (UIScrollView *) sv didScrollADistance: (CGFloat) distance

Entonces, ahora en scrollViewDidScroll: selector, cuando la vista de desplazamiento se desplaza, califica la distancia. Luego llame al método scrollView: didScrollDistance: del scrollDistanceDelegate.

En este punto, para la parte superior de CollectionView, scrollDistanceDelegate se establecería en la parte inferior de CollectionView, y la parte inferior de CollectionViews, scrollDistancedelgate, se establecería en la parte superior de CollectionView.

Entonces, cuando una CollectionView se desplaza, la otra se desplaza. el único problema que veo es un ciclo de retroalimentación. Uno se desplaza, el otro se desplaza, lo que le dice al primero que se desplace ...

Pero eso debería poder tratarse.