我试图在以下委托方法中修改我的滚动的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.
是否禁止在此特定委托方法中更改内容偏移量?如果是这样,我什么时候可以改变偏移?我正在尝试执行动画,一旦用户完成拖动(在一定量之后),将可见滚动区域返回到顶部。
谢谢!
答案 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
您可以选择要用于滚动视图的目标内容偏移量,以便在用户停止拖动时减速。