事件处理方法

UIResponder中定义了一系列对事件的处理方法,他们分别是:

  • –(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event
  • –(void)touchesMoved:(NSSet )touches withEvent:(UIEvent )event
  • –(void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event
  • –(void)touchesCancelled:(NSSet )touches withEvent:(UIEvent )event

从方法名字可以知道,他们分别对应了屏幕事件的开始、移动、结束和取消几个阶段,前三个阶段理解都没问题,最后一个取消事件的触发时机是在诸如突然来电话或是系统杀进程时调用。这些方法的第一个参数定义了UITouch对象的一个集合(NSSet),它的数量表示了这次事件是几个手指的操作,目前iOS设备支持的多点操作手指数最多是5。第二个参数是当前的UIEvent对象。下图展示了一个UIEvent对象与多个UITouch对象之间的关系。

一、点击事件

首先,新建一个自定义的View继承于UIView,并实现上述提到的事件处理方法,我们可以通过判断UITouch的tapCount属性来决定响应单击、双击或是多次点击事件。

MyView.m

1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 
#import "MyView.h"
@implementation MyView -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  for (UITouch *aTouch in touches) {  if (aTouch.tapCount == 2) {  // 处理双击事件  [self respondToDoubleTapGesture];  }  } } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { } -(void)respondToDoubleTapGesture {  NSLog(@"respondToDoubleTapGesture"); } @end 

二、滑动事件

滑动事件一般包括上下滑动和左右滑动,判断是否是一次成功的滑动事件需要考虑一些问题,比如大部分情况下,用户进行一次滑动操作,这次滑动是否是在一条直线上?或者是否是基本能保持一条直线的滑动轨迹。或者判断是上下滑动还是左右滑动等。另外,滑动手势一般有一个起点和一个终点,期间是在屏幕上画出的一个轨迹,所以需要对这两个点进行判断。我们修改上述的MyView.m的代码来实现一次左右滑动的事件响应操作。

MyView.m

1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 
#import "MyView.h"
#define HORIZ_SWIPE_DRAG_MIN  12    //水平滑动最小间距 #define VERT_SWIPE_DRAG_MAX 4 //垂直方向最大偏移量 @implementation MyView -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  UITouch *aTouch = [touches anyObject];  // startTouchPosition是一个CGPoint类型的属性,用来存储当前touch事件的位置  self.startTouchPosition = [aTouch locationInView:self]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  UITouch *aTouch = [touches anyObject];  CGPoint currentTouchPosition = [aTouch locationInView:self];  // 判断水平滑动的距离是否达到了设置的最小距离,并且是否是在接近直线的路线上滑动(y轴偏移量)  if (fabsf(self.startTouchPosition.x - currentTouchPosition.x) >= HORIZ_SWIPE_DRAG_MIN &&  fabsf(self.startTouchPosition.y - currentTouchPosition.y) <= VERT_SWIPE_DRAG_MAX)  {  // 满足if条件则认为是一次成功的滑动事件,根据x坐标变化判断是左滑还是右滑  if (self.startTouchPosition.x < currentTouchPosition.x) {  [self rightSwipe];//右滑响应方法  } else {  [self leftSwipe];//左滑响应方法  }  //重置开始点坐标值  self.startTouchPosition = CGPointZero;  } } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {  //当事件因某些原因取消时,重置开始点坐标值  self.startTouchPosition = CGPointZero; } -(void)rightSwipe 

转载于:https://www.cnblogs.com/dannygao/p/7088697.html

iOS事件机制,以及不同手势使用touchesBegan等表现形式相关推荐

  1. iOS事件机制(一)

    本篇内容将围绕iOS中事件及其传递机制进行学习和分析.在iOS中,事件分为三类: 触控事件(单点.多点触控以及各种手势操作) 传感器事件(重力.加速度传感器等) 远程控制事件(远程遥控iOS设备多媒体 ...

  2. iOS事件机制,以及不同手势使用touchesBegan等表现

    2019独角兽企业重金招聘Python工程师标准>>> //事件处理方法 UIResponder中定义了一系列对事件的处理方法,他们分别是: –(void)touchesBegan: ...

  3. iOS事件拦截(实现触摸任意位置隐藏指定view)

    项目里有一个需求,类似新浪或者腾讯微博的顶部title栏的类别选择器的消失(在选择器展开的时候,触摸屏幕任何地方使其消失). 最开始的想法是当这个选择器(selectorView)展开的时候,在当前屏 ...

  4. ios事件-触摸事件2(手势 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

    ios事件-触摸事件2(手势 和 pointInSide().hitTest().touchesBegan().touchesMoved().touchesEnded().touchesCancell ...

  5. iOS 事件分类及事件分发机制

       什么是事件分发机制,当用户触碰屏幕后,其事件的传递过程被称作事件的分发,IOS的事件分发机制大致原理与Android及其相似.该事件传递过程往往都是由父控件一步一步向其子控件进行分发的. 事件分 ...

  6. iOS UITouch触摸与UIGesture手势.01.事件、触摸(touch)事件

    一.iOS事件: 1.事件:事件就是当你在手机上点击手机屏幕.滑动手机翻面.摇动手机的时候,手机做出一些反应,对应的在应用程序里实现了某些代码的某些功能,完成这个过程就是一个事件. 2.iOS事件类型 ...

  7. React Native 手势触摸事件机制详解(进阶篇)

    源码已开源到Github,详细代码可以查看:<React Native 触摸事件代码实践>. 在基础篇,对RN中的触摸事件做了详细的介绍.相信大家对于触摸事件流程机制有了更为清晰的认识.没 ...

  8. ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

    ios事件-触摸事件3(UIButton 和 pointInSide().hitTest().touchesBegan().touchesMoved().touchesEnded().touchesC ...

  9. iOS事件全面解析 (触摸事件、手势识别、摇晃事件、耳机线控)

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

最新文章

  1. 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面
  2. python中bind的用法_JS中的apply、call和bind的用法和区别
  3. 跨sql server查询mysql_SQL Server 跨数据库查询数据的方法
  4. 跟本菜菜一起去体验Microsoft Windows Server Code Name Longhorn Server Core
  5. 知识图谱 图数据库 推理_图数据库的知识表示与推理
  6. 【微机原理与接口技术】具体芯片(1)并行接口8255A(1):全局观
  7. mysql学习笔记 查找技术 1207 0311
  8. 内蒙古大学计算机组成原理难吗,内蒙古大学计算机组成原理期末练习0.doc
  9. kali学习-主动信息收集
  10. 小米 html5定位失败,小米手表GPS定位慢怎么办 GPS定位失败及室内无法定位解决方法...
  11. fastlane:构建、测试和发布 React Native 应用程序
  12. 今天结束了ie被劫持的生活
  13. 文字-汉字-生僻字:生僻字1
  14. c语言程序设计 自考,自考“C语言程序设计”模拟试题九
  15. 每页都有的表头和打印分页
  16. 王老六计算机,crc校验和累加和校验哪个好
  17. 游戏建模过程中如何布线?建模布线原理和技巧
  18. Android发送图片到指定邮箱(仅客户端简单实现,不需服务端配合)
  19. 获取米家设备token
  20. 知识体系:如何构建自己的知识体系

热门文章

  1. Python数据分析模块 | pandas做数据分析(三):统计相关函数
  2. QGIS中如何加载identify
  3. 保存时间 默认_操作技能|WORD文档没保存,有办法恢复吗?
  4. 不需要安全实验证也可以开微信号_热门行业:电子专用设备工程师证考试报名时间及报名须知...
  5. angularjs上传文件到服务器,AngularJS:如何使用multipart表单实现简单的文件上传?...
  6. linux如何结束音乐是什么函数,与音乐有关的linux命令
  7. pytorch初试:CNN实现
  8. 网络/系统调试维护笔记
  9. Android SDK中tools详解
  10. linux 数据库 超出,[QAD]数据库超过2G,备份出现问题(linux)