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

现在在这之后,我的滚动视图变得太生涩了,我怎样才能防止滚动视图的这种生涩滚动?是否有一个共同的委托而不是这三个方法甚至前两个方法?提前感谢您的帮助。

4

1 回答 1

3

这里的计算不应该弄乱你的滚动。问题是由前两种方法之间的冲突引起的:

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

您需要检查willDecelarate第一种方法中的参数。如果是真的,什么也不做——scrollViewDidEndDecelerating最终会被调用。如果为假,请在此处进行计算。什么时候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 回答