6

我有一个水平的 UIScrollView。我想做一个“pull-to-reset”动画的变体,我一直拉到滚动视图内容大小的右边缘,松开手指,让滚动视图飞回 (0, 0 ) 内容偏移量。

我的委托方法如下所示:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    //check if it exceeds a certain critical value
    if (scrollView.contentOffset.x - (scrollView.contentSize.width - IMAGE_WIDTH) > 80) {
        [self doAnimatedScrollTo:CGPointMake(0, 0)];
    }
}

哪里doAnimatedScrollTo:需要自定义动画方法,因为我想控制动画的持续时间。

虽然这可行,但动画似乎已排队。UIScrollView“反弹”动画首先发生,然后我的动画发生。

有没有办法取消反弹动画,保持内容偏移从“捕捉”回来,然后执行我的动画?

4

2 回答 2

3

try this

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  //check if it exceeds a certain critical value
  if (scrollView.contentOffset.x - (scrollView.contentSize.width - IMAGE_WIDTH) > 80) {
    [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
  }
}
于 2013-09-05T10:13:21.513 回答
2

我完成了取消 UIScrollView 的反弹动画。

我想在弹跳时快速滚动到顶部时保留默认行为。但是,如果滚动视图已经在顶部,然后用户将其拉下并释放(类似于拉到刷新),我想控制反弹并做一些自定义的事情。

在滚动视图委托中,我跟踪初始位置:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0.1)
    {
        isPullingTop = YES;
    }
}

在滚动视图委托中检测是否设置了标志并且滚动视图被拖动得足够多

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (isPullingTop && scrollView.contentOffset.y < -30) {

        overrideBounce = YES;
    }
    isPullingTop = NO;
}

我继承滚动视图并覆盖 setContentOffset:

-(void)setContentOffset:(CGPoint)contentOffset
{
    if (!overrideBounce)
    {
        [super setContentOffset:contentOffset];
    }
    else
    {
        //customs stuff goes here , for example an animation
        overrideBounce = NO;
    }
}
于 2013-10-15T19:06:29.393 回答