1

UIScrollView をスクロールするたびにラベルのテキストを更新する必要があります...またはスクロールして任意の時点で停止するたびに。このラベルのテキストの更新は、スクロールビューの contentoffset に基づいて行われます。だから今、私は各メソッドにチェックを入れています:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
     int one = scrollView.contentOffset.x/21;
     int two = (21*one)+14;
     CGPoint point = CGPointMake(two, scrollView.contentOffset.y);
     [scrollView setContentOffset:point animated:YES];
     [self setLabelText:@"scroll"];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    int one = scrollView.contentOffset.x/21;
    int two = (21*one)+14;
    CGPoint point = CGPointMake(two, scrollView.contentOffset.y);
    [scrollView setContentOffset:point animated:YES];
    [self setLabelText:@"scroll"];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGPoint offset = scrollView.contentOffset;
    if (offset.x < minuteScrollMinX) offset.x = minuteScrollMinX;
    if (offset.x > minuteScrollMaxX) offset.x = minuteScrollMaxX;
    scrollView.contentOffset = offset;
}

この後、スクロールビューがぎくしゃくしすぎます。スクロールビューのこのぎくしゃくしたスクロールを防ぐにはどうすればよいですか? これらの 3 つのメソッドまたは上位 2 つのメソッドの代わりに、共通のデリゲートはありますか? 助けてくれてありがとう。

4

1 に答える 1

3

ここでの計算によってスクロールが乱れることはありません。この問題は、上位 2 つの方法の競合が原因で発生します。

 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

willDecelarate最初のメソッドの引数を確認する必要があります。true の場合、何もしません -scrollViewDidEndDecelerating最終的に呼び出されます。偽の場合は、ここで計算を行います。が true の場合willDecelarate、両方のメソッドから計算を呼び出しているため、スクロールが台無しになります。

どちらの場合も計算は同じなので、それらを共通の方法に因数分解することもできます。

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
         [self calculateScrollOffset];
    }

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
                      willDecelerate:(BOOL)decelerate
    {
        if (!decelerate) {
             [self calculateScrollOffset];
             }
    }


- (void) calculateScrollOffset
{
    int one = scrollView.contentOffset.x/21;
     int two = (21*one)+14;
     CGPoint point = CGPointMake(two, scrollView.contentOffset.y);
     [scrollView setContentOffset:point animated:YES];
     [self setLabelText:@"scroll"];
}
于 2013-07-05T07:59:57.330 に答える