博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIScrollView,点击、滑动翻页事件的区分
阅读量:6172 次
发布时间:2019-06-21

本文共 2346 字,大约阅读时间需要 7 分钟。

 

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. }  

 

 

转载于:https://www.cnblogs.com/pengyingh/articles/2360261.html

你可能感兴趣的文章
Laravel 5.2数据库--迁移migration
查看>>
ExtJs Extender controls 不错的例子
查看>>
html的基础知识
查看>>
Mybatis Sql片段的应用
查看>>
突发奇想20150126
查看>>
Nginx + CGI/FastCGI + C/Cpp
查看>>
学习笔记------jsp页面与jsp标记
查看>>
DS博客作业02--线性表
查看>>
第三届ACM山东省赛I题_Chess_STL
查看>>
jQuery each和js forEach用法比较
查看>>
前端笔记-作用域链的一些理解加记录(JS高级程序设计读书笔记1)
查看>>
改造你的网站,变身 PWA
查看>>
Leetcode 142. Linked List Cycle IIJAVA语言
查看>>
网络基础5
查看>>
Exchange Supported operating system platforms
查看>>
unity3鼠标点击移动
查看>>
Linux 安装中文包
查看>>
谷物大脑
查看>>
访问控制-禁止php解析、user_agent,PHP相关配置
查看>>
AgileEAS.NET之系统架构
查看>>