无法在scrollViewDidEndDragging中设置ContentOffset

我试图在下面的委托方法中修改我的滚动的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; }]; 

问题是,尽pipe这会立即更改偏移量(animation完成后由日志certificate),但不会更改可见滚动位置。 我的滚动视图的后续委托方法进一步certificate了这一点,表明边界确实没有改变。 这意味着y位置不是0。

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

谢谢!

我最终做的是再次派遣到主队列。 含义:

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

它实际上工作:-)

您应该在animation之前“删除”您的scrollView委托,在scrollViewDidEndDragging:willDecelerate:设置内容偏移scrollViewDidEndDragging:willDecelerate:将导致重复委派。

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

根据你试图达到的效果,你可能有更多的运气与这个委托方法:

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

您可以select要使滚动视图减速到用户停止拖动的目标内容偏移量。