UIScrollView 确实发生的滚动事件

Posted

技术标签:

【中文标题】UIScrollView 确实发生的滚动事件【英文标题】:UIScrollView events for scrolling that definitely occurred 【发布时间】:2013-07-16 03:00:21 【问题描述】:

我正在使用UIScrollview,并根据用户是向左还是向右滚动,我重新配置了 UI。问题是我需要验证用户是否确实从一个屏幕跨越到另一个屏幕(沿着contentOffset 的东西)。

我试过用这个方法:

  -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

但是,如果用户将滚动视图部分地向一个方向移动,但不会完成手势,则会触发。

这个方法我也试过了:

   -(void)scrollViewDidScroll:(UIScrollView *)scrollView;

但主要是相同的问题;滚动视图左右滚动,但在 iPhone 上,内容为 640 ( 320 * 2)。我试图弄清楚卷轴是否从一个位置跨越到另一个位置。

有什么建议吗?

【问题讨论】:

那么,-scrollViewDidScroll 缺少哪些信息/功能?每当用户平移滚动视图时都会调用它,您可以检查 scrollView.contentOffset 以获取内容的当前位置。 【参考方案1】:

我不完全确定您所说的“从一个屏幕跨越到另一个屏幕”是什么意思,我假设您的意思是分页?如果是这样,您可以这样做:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender 
    int page = sender.contentOffset.x / width;
    [self.pageControl setCurrentPage:page]; // in case you need it for updating a UIPageControl

【讨论】:

好吧,没有 PageControl 本身,抱歉这个词的选择,在我的情况下,滚动视图在 iPhone 上左右滚动,内容为 640 ( 320 * 2)。我试图弄清楚滚动是否从一个位置交叉到另一个位置,因为您可能会遇到用户有点拖动滚动视图但随后释放它并且它不会交叉的情况;不像阈值那样交叉使其移动到下一个屏幕。 你在滚动视图上使用分页吗?因为那时这个功能是免费内置的。【参考方案2】:

我找到了一种方法:

我有一个变量来维护 contentOffset 的 x 位置

 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
   currX = self.scrollView.contentOffset.x;
 

然后在这个事件中:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
   if(self.scrollView.contentOffset.x == currX ) 
      return;//This is what I needed, If I haven't panned to another view return
   
 //Here I do my thing.

【讨论】:

以上是关于UIScrollView 确实发生的滚动事件的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 iOS 7.0 中的 UIScrollView 中滚动?

目标 C:检测 UIScrollView 上的触摸事件

UIScrollView 一个分页器

UiScrollview scrollviewDidScroll 检测用户触摸

滚动视图,按钮事件交换

通过代理监听UIScrollView的滚动事件 Objective-C语言