1

タイトルが示すように、同じコンテンツを横方向に表示しているUIViewController2 つがあります。UICollectionViewsメインの写真は一度に 1 枚の写真を表示し、親指の写真は複数の写真を表示します。

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

2 に答える 2

3

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;

}
于 2013-06-25T18:14:01.067 に答える
1

デリゲートを使用します。CollectionView をサブクラス化し、scrollViewDelegate のセレクター scrollViewDidScroll: を実装します。という新しいプロパティも作成します

id scrollDistanceDelegate;

サブクラス CollectionView で独自のプロトコルを作成します。このプロトコルは、スクロール ビューがスクロールされたときに呼び出され、スクロールされた距離を送信します。したがって、プロトコルセレクターは次のようになります。

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

したがって、scrollViewDidScroll: セレクターでは、スクロールビューがスクロールするたびに、距離が計算されます。次に、scrollDistanceDelegate の scrollView:didScrollDistance: メソッドを呼び出します。

この時点で、上部 CollectionView の scrollDistanceDelegate が下部 CollectionView に設定され、下部 CollectionView の scrollDistancedelgate が上部 CollectionView に設定されます。

そのため、CollectionView がスクロールするたびに、もう一方もスクロールします。私が目にする唯一の問題は、フィードバック ループです。1 つはスクロールし、もう 1 つはスクロールし、最初の 1 つにスクロールするように指示します....

しかし、それは対処できるはずです。

于 2013-06-25T18:11:17.853 に答える