`
beike
  • 浏览: 361982 次
社区版块
存档分类
最新评论

[zt]UIScrollView,点击、滑动翻页事件的区分

 
阅读更多

UIScrollView,点击、滑动翻页事件的区分

 

http://blog.csdn.net/gavinming/article/details/6552565

 

 最近看到有人问这个问题:在UIScrollView上添加了一个View,View上面有图片等元素,需要对单击和滑动事件进行区分。这样的问题有以下几个经常会用到的地方:

     (1)点击UIScrollView上的图片,跳转到其他页面;同时不影响UIScrollView的滑动操作。

     (2)在阅读浏览类产品会经常用到,点击屏幕的中间区域,隐藏/显示状态栏或导航条;同时不影响UIScrollView的滑动翻页操作。

 

       有解决方法事在点击区域添加一个透明的Button,但个人感觉比较复杂,而且效果并不好。以下是我个人的解决方法:

 

       首先了解下UIScrollView对于touch事件的接收处理原理:UIScrollView重载hitTest 方法,并总会返回itself 。所以所有的touch 事件都会进入到它自己里面去了。内部的touch事件检测到这个事件是不是和自己相关的,或者处理或者除递给内部的view。

       为了检测touch是处理还是传递,UIScrollView当touch产生一个timer。

(1)如果150ms内touch未产生移动,它就把这个事件传递给内部view;

(2)如果150ms内touch产生移动,开始scrolling,不会传递给内部的view。(如当你touch一个table时候,直接scrolling,你touch的那行永远不会highlight。)

(3)如果150ms内touch未产生移动并且UIScrollView开始传递内部的view事件,但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling。(如当你touch一个table, 停止了一会,然后开始scrolling,那一行就首先被highlight,但是随后就不在高亮了)

 

       先前提到的在UIScrollView内部的view点击区域添加透明Button的解决方法,就是需要设置canCancelContentTouches = YES,而且还需重写UIScrollView的touchesShouldCancelInContentView:(UIView *)view方法,在view为UIButton的时候,返回YES。不然点击到button上的事件已经被button接收了,无法cancle掉。另外针对阅读浏览页面,一般手指都会停留在UIScrollView滚动,如果需要隐藏/显示状态栏或导航条,则会出现每点击一次就出现隐藏/显示问题。

 

       解决方法:该问题主要的难题要判断单击事件。由于150ms很小,因此基本上手指一接触到UIScrollView就会传递到内部的view上,此时内部的view需对这个touch进行时间节点的判断,判断它是一个单击事件,然后执行单击操作。

 

 

 

 1、TestView是ScrollView的subview,也可也是继承UIScrollView

 

TestView.h

 

  1. @interface TestView : UIView  
  2. {  
  3.     UIImageView *imageView;   
  4.     NSTimeInterval touchTimer; //记录touch时间,来控制点击和滑动判断  
  5. }  
  6. @property(nonatomic, retain) UIImageView *imageView;  
  7. @property(nonatomic, assign) NSTimeInterval touchTimer;  
 

 

 

TestView.m

 

 

  1. @implementation TestView  
  2. #pragma mark -  
  3. #pragma mark Touch Method  
  4. @synthesize imageView;  
  5. @synthesize touchTimer;  
  6.   
  7. //thouchesBegan 获取到touch的时间点  
  8. - (void)touchesBegan:(NSSet *)touches   
  9.            withEvent:(UIEvent *)event  
  10. {  
  11.     UITouch *touch = [touches anyObject];  
  12.     self.touchTimer = [touch timestamp];  
  13. }  
  14.   
  15.   
  16. //touchesEnded,touch事件完成,根据此时时间点获取到touch事件的总时间,  
  17. - (void)touchesEnded:(NSSet *)touches   
  18.            withEvent:(UIEvent *)event  
  19. {  
  20.     UITouch *touch = [touches anyObject];  
  21.     self.touchTimer = [touch timestamp] - self.touchTimer;  
  22.       
  23.     NSUInteger tapCount = [touch tapCount];  
  24.     CGPoint touchPoint = [touch locationInView:self];  
  25.       
  26.     //判断单击事件,touch时间和touch的区域  
  27.     if (tapCount == 1 && self.touchTimer <= 3 && CGRectContainsPoint(self.imageView.frame, touchPoint))  
  28.     {  
  29.         //进行单击的跳转等事件  
  30.     }  
  31.       
  32. }  
 

 

分享到:
评论

相关推荐

    UIScrollView 平滑滑动示例

    翻页过程中(scrollViewDidScroll),进行必要的即时更新,但这个更新操作必须尽量少,以免影响划动的平滑体验,如加载较小的缩略图。而在翻页后,再通过延时操作载入全部内容进行更新。这样处理后的体验就跟iOS设备...

    ios UIScrollView响应touch事件

    这种设计保证了用户可以同时与`UIScrollView`的子视图交互,比如点击按钮或拖动其他可交互元素,而不会打断整体的滚动操作。 开发者还可以自定义`UIScrollView`的触摸行为,例如通过重写`touchesBegan:withEvent:`...

    ios UIScrollView 循环滑动

    总之,实现iOS中的UIScrollView循环滑动涉及到对UIScrollView的工作机制的理解,以及对滚动事件的精确控制。通过复制并重新排列内容视图中的元素,我们可以创造出视觉上的无限循环效果,让用户体验到流畅的滑动浏览...

    iOS UIScrollView左右滑动

    总的来说,利用`UIScrollView`及其子类`UITableView`和`UICollectionView`实现左右滑动的关键在于正确的设置`contentSize`和`pagingEnabled`属性,并适当地监听和响应滑动事件。通过这种方式,我们可以创建出丰富的...

    ios-UIScrollView分页滑动宽度自定义.zip

    3. 调整scrollView.delegate方法,监听滑动事件,实现自定义的行为,例如在滑动过程中更新其他界面元素。 最后,开发者可能会提供一些示例代码片段或教程,解释如何在实际项目中应用这些技巧。通过阅读和分析这些...

    Swift-一句代码让UIScrollView的滑动和系统侧滑手势并存

    5. 这个方法告诉系统,当用户在UIScrollView上滑动时,侧滑返回手势应该等待直到UIScrollView的滑动手势失败。这样,只有当用户停止在UIScrollView上的滑动时,侧滑返回手势才会生效。 6. 为了确保与第三方库如...

    Go-完美解决UIScrollView嵌套滑动手势冲突

    在iOS开发中,特别是在设计复杂用户界面时,如个人主页、电商首页或淘宝/天猫店铺页,经常需要处理UIScrollView的嵌套滑动问题。当一个UIScrollView内嵌套另一个UIScrollView时,手势识别会变得复杂,可能导致手势...

    UIScrollview左右循环滑动与自动轮播

    在本教程中,我们将探讨如何实现一个`UIScrollView` 的左右循环滑动功能,同时具备自动轮播的效果。这个功能通常用于制作广告轮播、图片展示等场景。 首先,我们需要了解`UIScrollView`的基本属性和方法。`content...

    GKPageSmoothView是一个可延续滑动的UIScrollView嵌套滑动库

    GKPageScrollView是一个UIScrollview嵌套滑动库,主要参考了JXPagingView,在他的基础上做了修改,实现了自己想要的效果。支持上下滑动、左右滑动,手势返回等。支持如UITableView的sectionView的悬停效果。支持多种...

    滑动翻页移动端

    滑动翻页的核心原理是监听用户的触摸事件,根据用户的滑动方向和速度来判断是否进行翻页操作。在Android和iOS平台上,都有相应的API可以支持手势识别。例如,Android中的`GestureDetector`和`Scroller`类,iOS中的`...

    无限循环翻页ScrollView加UIPageControl

    一个利用UIScrollView结合UIPageControl的小...3、每个page页都可获取点击事件,以实现与主页面的互动。 如有疑问或其它技术相关需要请发送邮件至:haoxuliang@gmail.com 或者QQ:281574702 联系 ————郝旭亮

    UIScrollView无限循环

    `UIScrollView` 内容区域可以比其实际显示区域大,用户可以通过滑动来查看超出可视范围的内容。为了实现无限循环,我们需要做的是在内容的开头和结尾添加重复的副本,这样当用户滚动到最后一项时,会无缝过渡到第一...

    UIScrollView分页循环滑动

    在实际应用中,我们经常需要实现类似轮播图或者商品展示的效果,这时就需要利用 `UIScrollView` 的分页循环滑动功能。同时,`UITableView` 作为另一种常见的滚动视图,虽然主要用于垂直方向的滚动,但有时也需要实现...

    UIScrollView滑动分页效果

    一个基于UIScrollView滑动分页效果类似于网易新闻效果但原理不一样,更简单一些,功能比较适合数据的分页展示,原理是设置UIScrollView的ContentSize根据滑动得到的index ContentOffset到不同的位置,demo非常简单...

    滑动翻页的图片效果

    在Android和iOS平台上,滑动翻页的实现方式有所不同,但核心思想都是捕捉用户的触摸事件,计算滑动距离,然后根据滑动方向和速度来切换图片或内容。 在Android中,实现滑动翻页的图片效果可以使用ViewPager组件。...

    ios-UIScrollView上添加多个TableView.zip

    同时,Button的点击事件需要与ScrollView的滚动事件同步,以更新选中状态和红线位置。为了实现这些,开发者可能利用了Swift中的手势识别(Gesture Recognizer)、KVO(Key-Value Observing)或者其他监听方法。 ...

    UIScrollView定时滚动和循环滚动,可点击图片和PageController

    这个示例综合运用了`UIScrollView`的滚动逻辑、定时器、手势识别和页面控制,展示了如何创建一个具备定时滚动、循环滚动、点击事件以及页面指示功能的滚动视图。这种设计常见于很多移动应用的首页或广告展示区域,...

    UIScrollview循环滑动

    总之,实现`UIScrollView`的循环滑动需要对`UIScrollView`的属性和代理方法有深入的理解,同时需要巧妙地处理视图的布局、滚动事件和动画。这个过程中涉及到的知识点包括:视图层次结构、滚动视图机制、内容大小设定...

    UIScrollView响应UITouc事件

    UIScrollView不能响应UITouch事件的解决办法,原因是:UIView的touch事件被UIScrollView捕获了。 解决办法:让UIScrollView将事件传递过去。于是最简单的解决办法就是加一个UIScrollView的category。这样每个用到...

    一个循环滚动的UIScrollView

    在iOS开发中,`UIScrollView` 是一个非常重要的控件,它允许用户通过滑动来查看超过屏幕大小的内容。在很多应用场景中,如新闻列表、图片轮播等,我们需要实现一个循环滚动的效果,使得内容看起来是无限循环的。本文...

Global site tag (gtag.js) - Google Analytics