UIScrollView在分页时确定scrollViewDidEndDragging上的滚动方向

时间:2011-10-19 23:53:35

标签: iphone uiscrollview

当用户抬起手指时,有人知道如何确定滚动视图的移动方向,即当调用scrollViewDidEndDragging时?

具体来说,当滚动视图设置为分页时。

大多数时候,我只能跟踪并检查scrollViewDidScroll中的contentOffset,但是,有些特殊情况下用户可以快速轻弹屏幕。在某些情况下,LEFT-RIGHT-LEFT移动将滚动到下一页,而在其他情况下,相同的模式将保留在同一页面上。

我猜它有一些与触摸加速度(最后几点之间的差异)有关的事情。

(我在iPad上的iOS4.3上)

5 个答案:

答案 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");
   }
}