Ручная прокрутка двух UICollectionViews, показывающих одно и то же содержимое

Как следует из названия, у меня есть UIViewController с двумя UICollectionViews, которые отображают один и тот же контент по горизонтали. В основном отображается по одной фотографии, в превью несколько.

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

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

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

person VaporwareWolf    schedule 25.06.2013    source источник


Ответы (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;

}
person Turch    schedule 25.06.2013
comment
Спасибо. Это то, что я думал сделать, хотя я собирался создать подкласс UICollectionViews и отслеживать их события касания, чтобы отслеживать, какой из них активно прокручивается. Предоставленный вами метод делегата прекрасно работал после того, как я исправил математику для смещения. - person VaporwareWolf; 25.06.2013

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

id scrollDistanceDelegate;

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

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

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

В этот момент для scrollDistanceDelegate верхнего CollectionView будет установлено значение нижнего CollectionView, а для scrollDistancedelgate нижнего CollectionView будет установлено значение верхнего CollectionView.

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

Но с этим надо уметь справляться.

person John    schedule 25.06.2013