无法在scrollViewDidEndDragging中设置setContentOffset

时间:2013-10-04 16:02:13

标签: iphone ios objective-c uiscrollview core-animation

我试图在以下委托方法中修改我的滚动的contentOffset:

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

我尝试了以下两种方法:

[UIView animateWithDuration:.2 animations:^ {
   [scrollView setContentOffset:CGPointZero animated:NO];
}];

[UIView animateWithDuration:.2 animations:^ {
   CGRect svBounds = self.bounds;
   svBounds.origin.y = 0;
   self.bounds = svBounds; 
}];

问题是虽然这会立即改变偏移(在动画完成后通过日志证明),但它不会改变可见的滚动位置。我的滚动视图的后续委托方法进一步证明了这一点,它表明边界确实没有改变。意味着y位置不是0.

是否禁止在此特定委托方法中更改内容偏移量?如果是这样,我什么时候可以改变偏移?我正在尝试执行动画,一旦用户完成拖动(在一定量之后),将可见滚动区域返回到顶部。

谢谢!

3 个答案:

答案 0 :(得分:5)

我最终做的是再次调度到主队列。 意思是:

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"END DRAG");
CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity < 0) {
    NSLog(@"Up");
} else {
    NSLog(@"Down");
}

if (yVelocity < 0 && scrollView.contentOffset.y < -100 && scrollView.contentOffset.y > -200) //UP - Hide
{
    NSLog(@"hiding");
    dispatch_async(dispatch_get_main_queue(), ^{
        [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
    });
}
else if (yVelocity > 0 && scrollView.contentOffset.y < -100) //DOWN - Show
{
    NSLog(@"showing");
    dispatch_async(dispatch_get_main_queue(), ^{
        [scrollView setContentOffset:CGPointMake(0, -300) animated:YES];
    });
}

}

它确实有效: - )

答案 1 :(得分:1)

你应该在动画之前“nil”你的scrollView委托,在scrollViewDidEndDragging:willDecelerate:中设置内容偏移将导致重复委派。

self.scrollView.delegate = nil;
[self.scrollView setContentOffset:CGPointMake(x, y) animated:YES];
self.scrollView.delegate = self;

答案 2 :(得分:0)

根据您尝试实现的效果,您可以通过此委托方法获得更多好运:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

您可以选择要用于滚动视图的目标内容偏移量,以便在用户停止拖动时减速。