无法在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要使滚动视图减速到用户停止拖动的目标内容偏移量。