Manually scrolling two UICollectionViews showing the same content

风格不统一 提交于 2019-12-20 03:55:12

问题


As the title suggest, I have a UIViewController with two UICollectionViews which are displaying the same content in a horizontal fashion. The main one shows one photo at a time, the thumbs one shows several.

I have overridden the UIScrollViewDelegate method and added some code so that when the user scrolls the main CV, then the thumbs CV scrolls too. However I would like to enable the opposite as well (scroll the thumbs which will quickly move the main). However i'm getting a feedback effect.

Here is my code snippet:

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

    }
}

I imagine that I can track touch down/up events to mask out what's allowed to happen, but before I attempt that I thought I'd see if there is a different way to do this? I am I overlooking a provided method that will help me out here?

Thanks.

Edit: solution. There was a UIScrollViewDelegate method that provided what I needed to track which layout was being touched. Updated code:

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

回答1:


Keep track of the currently dragging scroll view when scrollViewWillBeginDragging: is called.

In scrollViewDidScroll:, update the scroll view that is not dragging:

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

}



回答2:


Use delegates. Subclass the CollectionView and implement the scrollViewDelegate's selector scrollViewDidScroll:. Also create a new property called

id scrollDistanceDelegate;

Now create your own protocol in the subclasses CollectionView. This protocol will be called when a scroll view is scrolled and will send the distance it was scrolled. So the protocol selector could be:

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

So now in the scrollViewDidScroll: selector, when ever the scrollview scrolls, it would calc the distance. Then call the scrollView:didScrollDistance: method of the scrollDistanceDelegate.

At this point, for the top CollectionView's scrollDistanceDelegate would be set to the bottom CollectionView, and the bottom CollectionViews' scrollDistancedelgate would be set to the top CollectionView.

So now when ever a CollectionView scrolls, the other would scroll. the only problem I see is a feed back loop. One scrolls, the other one scrolls, which tells the first one to scroll....

But that should be able to be dealt with.



来源:https://stackoverflow.com/questions/17303772/manually-scrolling-two-uicollectionviews-showing-the-same-content

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!