3

我正在尝试在以下委托方法中修改滚动的 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。

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

谢谢!

4

3 回答 3

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

}

它确实有效:-)

于 2014-11-23T12:19:42.433 回答
1

您应该在动画之前“取消”您的 scrollView 委托,设置内容偏移量scrollViewDidEndDragging:willDecelerate:将导致重复委托。

self.scrollView.delegate = nil;
[self.scrollView setContentOffset:CGPointMake(x, y) animated:YES];
self.scrollView.delegate = self;
于 2013-11-30T17:24:23.310 回答
0

根据您要达到的效果,您可能会更幸运地使用此委​​托方法:

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

一旦用户停止拖动,您可以选择滚动视图减速到的目标内容偏移量。

于 2013-11-30T17:43:04.257 回答