1

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.Défilement manuel de deux UICollectionViews affichant le même contenu

J'ai surchargé la méthode UIScrollViewDelegate et ajouté un peu de code pour que lorsque l'utilisateur 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; 

    } 
} 

Je suppose que je peux suivre les toucher down/up événements pour masquer ce qui est autorisé à se produire, mais avant que je tente que je pensais voir s'il y a une façon différente de le faire? Je suis je donnant sur une méthode fournie qui va m'aider ici?

Merci.

Édition: solution. Il y avait une méthode UIScrollViewDelegate qui fournissait ce dont j'avais besoin pour suivre la mise en page. Code à 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; 
} 

Répondre

2

Gardez une trace de l'affichage de défilement en cours lorsque vous appelez scrollViewWillBeginDragging:.

En scrollViewDidScroll:, mettre à jour la vue de défilement qui ne frottent pas:

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

} 
+0

Merci. C'est ce que je pensais faire, bien que j'allais sous-classer les UICollectionViews et suivre leurs événements tactiles pour savoir lequel défilait activement. La méthode déléguée que vous avez fournie a fonctionné à merveille après avoir corrigé les maths pour le décalage. – VaporwareWolf

1

Utilisez des délégués. Sous-classe 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-classes 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 

Alors maintenant dans le scrollViewDidScroll: sélecteur, chaque fois que les rouleaux de ScrollView, il serait calco la distance. Ensuite, appelez la méthode scrollView: didScrollDistance: de scrollDistanceDelegate. À ce stade, le paramètre scrollDistanceDelegate de CollectionView supérieur est défini sur CollectionView, et le paramètre scrollDistancedelgate de CollectionViews inférieur est défini sur CollectionView supérieur. Donc maintenant, quand un objet CollectionView défile, l'autre fait défiler l'écran. le seul problème que je vois est une boucle de retour. L'un défile, l'autre défile, ce qui indique au premier de faire défiler ....

Mais cela devrait pouvoir être traité.

Questions connexes