1

Как видно из названия, у меня есть UIViewController с двумя UICollectionViews, которые отображают один и тот же контент горизонтально. На главной показана одна фотография за один раз, а большие пальцы - несколько.Ручная прокрутка двух UICollectionViews, показывающих один и тот же контент

Я переопределил метод UIScrollViewDelegate и добавил код, чтобы пользователь прокрутил основное CV, а также прокручивает CV. Однако я хотел бы также включить и обратное (прокрутите большие пальцы, которые быстро перемещают основной). Однако я получаю эффект обратной связи.

Вот мой фрагмент кода:

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

    } 
} 

Я полагаю, что я могу отслеживать касание вниз/вверх событие, чтобы маскировать то, что позволено случиться, но прежде, чем я пытаю, что я думал, что увидит, если есть другой способ сделать это? Я упускаю из виду предоставленный метод, который поможет мне здесь?

Спасибо.

Редактировать: решение. Был метод UIScrollViewDelegate, который предоставил мне то, что мне нужно для отслеживания касания макета. Обновленный код:

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

ответ

2

Следите за просмотром прокрутки в настоящее время, когда вызывается scrollViewWillBeginDragging:.

В scrollViewDidScroll:, обновите вид прокрутки, не тащит:

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

Спасибо. Это то, что я собирался сделать, хотя я собирался подклассифицировать UICollectionViews и отслеживать их события касания, чтобы отслеживать, какой из них активно прокручивается. Метод делегата, который вы предоставили, отлично работал после того, как я исправил математику для смещения. – VaporwareWolf

1

Использование делегатов. Подкласс CollectionView и реализовать селектор scrollViewDelegate scrollViewDidScroll :. Также создайте новое свойство под названием

id scrollDistanceDelegate; 

Теперь создайте свой собственный протокол в подклассах CollectionView. Этот протокол будет вызываться, когда прокрутка будет прокручиваться и отправит пройденное расстояние. Таким образом, селектор протокола может быть:

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

Так что теперь в scrollViewDidScroll: селектор, когда-либо в Scrollview свитки, было бы известково расстояние. Затем вызовите метод scrollView: didScrollDistance: метод scrollDistanceDelegate.

В этот момент для верхнего элемента CollectionViewSrollViewDelegate будет установлен снизу CollectionView, а нижний элемент коллекции CollectionViews scrollDistancedelgate будет установлен в верхнюю часть CollectionView.

Итак, когда свиток CollectionView будет прокручиваться, другой будет прокручиваться. единственная проблема, которую я вижу, это цикл обратной связи. Один свиток, другой свиток, который говорит первому прокрутить ....

Но это должно быть в состоянии справиться.