Défilement manuel de deux UICollectionViews affichant le même contenu

Comme le suggère le titre, j'ai un UIViewController avec deux UICollectionViews qui affichent le même contenu horizontalement. Le principal montre une photo à la fois, les pouces en montrent plusieurs.

J'ai surchargé la méthode UIScrollViewDelegate et ajouté du code afin que lorsque l'user fait défiler le CV principal, le thumbs CV défile aussi. Cependant je voudrais activer le contraire aussi (faire défiler les pouces qui vont rapidement bouger le principal). Cependant, je reçois un effet de rétroaction.

Voici mon extrait de code:

 #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; } } 

J'imagine que je peux suivre les events d'atterrissage pour masquer ce qui est permis de se produire, mais avant que j'essaye que je pensais voir si il y a une manière différente de faire ceci? Je suis je donnant sur une méthode fournie qui va m'aider ici?

Merci.

Editer: solution. Il y avait une méthode UIScrollViewDelegate qui fournissait ce dont j'avais besoin pour suivre la layout. Code mis à jour:

 #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; } 

Gardez une trace de l'affichage déroulant en train de glisser quand scrollViewWillBeginDragging: est appelé.

Dans scrollViewDidScroll: mettez à jour l'affichage scrollViewDidScroll: qui ne fait pas glisser:

 - (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; } 

Utilisez les delegates. Sous-class CollectionView et implémenter le sélecteur scrollViewDelegate scrollViewDidScroll :. Créez également une nouvelle propriété appelée

 id scrollDistanceDelegate; 

Créez maintenant votre propre protocole dans les sous-classs CollectionView. Ce protocole sera appelé quand une vue déroulante défilera et enverra la distance parcourue. Ainsi, le sélecteur de protocole pourrait être:

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

Donc maintenant, dans le scrollViewDidScroll: selector, quand la scrollview défile, elle calcule la distance. Ensuite, appelez la méthode scrollView: didScrollDistance: de scrollDistanceDelegate.

À ce stade, la propriété scrollDistanceDelegate de CollectionView supérieure est définie sur CollectionView, et la propriété scrollDistancedelgate de CollectionViews inférieure est définie sur CollectionView supérieure.

Alors maintenant, quand un défilement CollectionView, l'autre ferait défiler. le seul problème que je vois est une boucle de return. L'un défile, l'autre défile, ce qui indique au premier de faire défiler ….

Mais cela devrait pouvoir être traité.