当用户抬起手指时,有人知道如何确定滚动视图的移动方向,即当调用scrollViewDidEndDragging时?
具体来说,当滚动视图设置为分页时。
大多数时候,我只能跟踪并检查scrollViewDidScroll中的contentOffset,但是,有些特殊情况下用户可以快速轻弹屏幕。在某些情况下,LEFT-RIGHT-LEFT移动将滚动到下一页,而在其他情况下,相同的模式将保留在同一页面上。
我猜它有一些与触摸加速度(最后几点之间的差异)有关的事情。
(我在iPad上的iOS4.3上)
答案 0 :(得分:3)
你不使用计时器,这是非常昂贵的操作。首先锁定scrollView的方向,仅向上/向下和向左/向右移动[我想这就是你想要的]。然后使用以下代码来确定......
CGPoint start, end;
- (void)scrollViewWillBeginDragging:(UIScrollView *)sender {
start = self.scrollView.contentOffset;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)sender willDecelerate:(BOOL)decelerate {
end = self.scrollView.contentOffset;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender {
NSLog(@"%d %d",(int)start.x,(int)start.y);
NSLog(@"%d %d",(int)end.x,(int)end.y);
}
答案 1 :(得分:2)
这是我的解决方案,对我来说很好,希望它有所帮助
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGFloat pageWidth = scrollView.frame.size.width;
//Old Solution
//Switch the indicator when more than 30% of the previous/next page is visible
//You can vary the percentage
//int page = floor((scrollView.contentOffset.x - pageWidth * 0.3) / pageWidth) + 1;
//New Solution
_pageControl.currentPage = (int)scrollView.contentOffset.x / (int)pageWidth;
}
我退出旧解决方案,因为新的解决方案看起来更光滑
答案 2 :(得分:2)
实现以下UIScrollViewDelegate方法。 您可以比较当前内容偏移量和targetContentOffset然后获取方向。
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
CGPoint newOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y);
if (newOffset.x > scrollView.contentOffset.x) {
NSLog(@"Scrolling direction is left");
}else{
NSLog(@"Scrolling direction is right");
}
}
答案 3 :(得分:1)
这是一个棘手的问题,iOS 5有answer,但这对你没什么好处。
或许一个hacky解决方法是在NSTimer
完成后设置scrollViewDidEndDragging
一小段时间间隔(比如0.1秒)。然后比较内容偏移量。
如果你想知道滚动视图是否真的会转到下一页,也许你可以检查内容偏移量是否超过1/2。您可以在scrollViewDidScroll:
上读取内容偏移量并进行一些数学运算以确定其是否超过1/2。
答案 4 :(得分:0)
除了saurin的反应。 她的解决方案工作正常,但是如果你使用分页并且你在滚动内容大小的末尾,你将不得不测试我们是否真的滚动到下一个“页面”:
CGPoint start, end;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
start = scrollView.contentOffset;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
end = scrollView.contentOffset;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (start.x > end.x && end.x>0)
{
NSLog(@"on the previous left page");
}
if (start.x < end.x && end.x < scrollView.contentOffset.x)
{
NSLog(@"on the next right page");
}
}