触摸屏幕是iOS设备接受用户输入的主要方式,包括单击、双击、拨动以及多点触摸等,这些操作都会产生触摸事件。

在Cocoa中,代表触摸对象的类是UITouch。当用户触摸屏幕后,就会产生相应的事件,所有相关的UITouch对象都被包装在事件中,被程序交由特定的对象来处理。UITouch对象直接包括触摸的详细信息。

UITouch类中包含5个属性:

window:    触摸产生时所处的窗口。由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口。

view:              触摸产生时所处的视图。由于视图可能发生变化,当前视图也不一定时最初的视图。
 tapCount:轻击(Tap)操作和鼠标的单击操作类似,tapCount表示短时间内轻击屏幕的次数。因此可以根据tapCount判断单击、双击或更多的轻击。
 timestamp:  时间戳记录了触摸事件产生或变化时的时间。单位是秒。
 phase:        触摸事件在屏幕上有一个周期,即触摸开始、触摸点移动、触摸结束,还有中途取消。通过phase可以查看当前触摸事件在一个周期中所处的状态。

phase是UITouchPhase类型的,这是一个枚举配型,包含了:

UITouchPhaseBegan(触摸开始)

UITouchPhaseMoved(接触点移动)

UITouchPhaseStationary(接触点无移动)

UITouchPhaseEnded(触摸结束)

UITouchPhaseCancelled(触摸取消)

UITouch类中包含如下成员函数:

- (CGPoint)locationInView:(UIView *)view:函数返回一个CGPoint类型的值,表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置。

- (CGPoint)previousLocationInView:(UIView *)view:该方法记录了前一个坐标值,函数返回也是一个CGPoint类型的值, 表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置。

当手指接触到屏幕,不管是单点触摸还是多点触摸,事件都会开始,直到用户所有的手指都离开屏幕。期间所有的UITouch对象都被包含在UIEvent事件对象中,由程序分发给处理者。事件记录了这个周期中所有触摸对象状态的变化。

只要屏幕被触摸,系统就会报若干个触摸的信息封装到UIEvent对象中发送给程序,由管理程序UIApplication对象将事件分发。一般来说,事件将被发给主窗口,然后传给第一响应者对象(FirstResponder)处理。

关于响应者的概念,通过以下几点说明:

响应者对象(Response object)

响应者对象就是可以响应事件并对事件作出处理。在iOS中,存在UIResponder类,它定义了响应者对象的所有方法。UIApplication、UIView等类都继承了UIResponder类,UIWindow和UIKit中的控件因为继承了UIView,所以也间接继承了UIResponder类,这些类的实例都可以当作响应者。

第一响应者(First responder):

当前接受触摸的响应者对象被称为第一响应者,即表示当前该对象正在与用户交互,它是响应者链的开端。
 响应者链(Responder chain):

响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder)。一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对象(如果存在),然后是它的父视图(superview)对象(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗口(UIWindow对象)再到程序(UIApplication对象)。如果整个过程都没有响应这个事件,该事件就被丢弃。一般情况下,在响应者链中只要由对象处理事件,事件就停止传递。但有时候可以在视图的响应方法中根据一些条件判断来决定是否需要继续传递事件。

管理事件分发

视图对触摸事件是否需要作处回应可以通过设置视图的userInteractionEnabled属性。默认状态为YES,如果设置为NO,可以阻止视图接收和分发触摸事件。除此之外,当视图被隐藏(setHidden:YES)或者透明(alpha值为0)也不会收事件。不过这个属性只对视图有效,如果想要整个程序都步响应事件,可以调用UIApplication的beginIngnoringInteractionEvents方法来完全停止事件接收和分发。通过endIngnoringInteractionEvents方法来恢复让程序接收和分发事件。如果要让视图接收多点触摸,需要设置它的multipleTouchEnabled属性为YES,默认状态下这个属性值为NO,即视图默认不接收多点触摸。

处理用户的触摸事件

首先触摸的对象是视图,而视图的类UIView继承了UIRespnder类,但是要对事件作出处理,还需要重写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;

当手指接触屏幕时,就会调用touchesBegan:withEvent方法;

当手指在屏幕上移时,动就会调用touchesMoved:withEvent方法;

当手指离开屏幕时,就会调用touchesEnded:withEvent方法;

当触摸被取消(比如触摸过程中被来电打断),就会调用touchesCancelled:withEvent方法。而这几个方法被调用时,正好对应了UITouch类中phase属性的4个枚举值。

上面的四个事件方法,在开发过程中并不要求全部实现,可以根据需要重写特定的方法。对于这4个方法,都有两个相同的参数:NSSet类型的touches和UIEvent类型的event。其中touches表示触摸产生的所有UITouch对象,而event表示特定的事件。因为UIEvent包含了整个触摸过程中所有的触摸对象,因此可以调用allTouches方法获取该事件内所有的触摸对象,也可以调用touchesForVIew:或者touchesForWindows:取出特定视图或者窗口上的触摸对象。在这几个事件中,都可以拿到触摸对象,然后根据其位置,状态,时间属性做逻辑处理。

下面是移动某一个试图内的子视图的小动画的实现效果,代码不全,精髓在其中:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{UITouch *touch = [touches anyObject];if([self.view pointInside:[touch locationInView:rollView] withEvent:nil])originLocation = [touch locationInView:self.view];
}-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{UITouch *touch = [touches anyObject];if([self.view pointInside:[touch locationInView:rollView] withEvent:nil]){CGPoint currentLocation = [touch locationInView:self.view];CGRect frame = rollLabel.frame;frame.origin.x = currentLocation.x - originLocation.x;if(frame.origin.x < -10)frame.origin.x = -10;if(frame.origin.x > rollView.frame.size.width)frame.origin.x = rollView.frame.size.width;frame.origin.y = labelLocation.y;rollLabel.frame = frame;}
}

可以根据自己的需求对上面的代码进行修改。

下面是在ios开发中常见的功能。即touch移动事件,是移动到当前视图的子视图中,还是移动到当前视图以外了。

办法是,继承UIView,覆盖touchesMoved方法:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch=[touches anyObject]; if (![self pointInside:[touch locationInView:self] withEvent:nil]) { NSLog(@"touches moved outside the view"); }else { UIView *hitView=[self hitTest:[[touches anyObject] locationInView:self] withEvent:nil]; if (hitView==self) { NSLog(@"touches moved in the view"); }else{ NSLog(@"touches moved in the subview"); } }
}

触摸事件UITouch的用法相关推荐

  1. android dispatchtouchevent 用法,android – 检测每个触摸事件,而不会覆盖dispatchTouchEvent()?...

    回答这可能对他人有帮助.答案将有助于需要拦截触摸事件的库. 如果你不想覆盖dispatchTouchEvent()(Imp,如果你是编程库)方法的活动,那么我们可以使用Window.Callback类 ...

  2. cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate

    cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate    以下内容转载自:http://blog.sin ...

  3. Swift - 触摸事件(点击,移动,抬起等)说明及用例

    在iOS开发中,UIGestureRecognizer可以方便的响应处理手势事件. 而如果要想更精细的处理,我们还需要借助touchesBegan,touchesMoved,touchesEnded等 ...

  4. WP7开发—Silverlight多点触摸事件详解【含Demo代码】

    最近在学习WP7的Silverlight编程,就把学习到知识点整理为日志,方便自己理解深刻点,也作为笔记和备忘,如有不合理或者错误之处,还恳请指正. WP7的支持多点触摸,有两种不同的编程模式: 1. ...

  5. 触摸事件练习 -- 手势解锁

    Main.storyboard <?xml version="1.0" encoding="UTF-8" standalone="no" ...

  6. 浅析iOS中的触摸事件

    一.什么是响应者对象? 在 iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象".UIApplication.UIV ...

  7. UI进阶--Quartz2D和触摸事件的简单使用:简易涂鸦板

    需求:实现一个简易的涂鸦板应用,使用鼠标在涂鸦板内拖动即可进行涂鸦,点击保存按钮,可以把完成的涂鸦保存,点击回退按钮可以向后退回一步,点击清空可以让涂鸦板清空. 实现步骤: 1.布局storyboar ...

  8. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

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

  9. 移动开发:iphone开发之触摸事件详解

    转:http://blog.sina.com.cn/s/blog_8988732e01012eaf.html iPhoneOS中的触摸事件基于多点触摸模型.用户不是通过鼠标和键盘,而是通过触摸设备的屏 ...

最新文章

  1. Bundle Adjustment原理及应用(附实战代码)
  2. 《Science》基因组比对的革命性技术
  3. maven的pom.xml用<exclusion>解决版本问题
  4. Java开源——常见J2EE框架简介
  5. 一个历史遗留项目清理总结
  6. 【蓝桥杯Java_C组·从零开始卷】第六节(二)、蓝桥杯常用数学公式
  7. 程序人生之回顾大学前两年----第二篇
  8. JavaScript instanceof的实现
  9. 中resource文件夹的作用_冲突与碰撞:OpenStack中的虚拟机和裸机
  10. Docker如何更改存储库名称或重命名图像?
  11. Root cause be too many concurrent connections error could not open clinet transport with jdbc uri
  12. MySql学习10-----存储过程和函数
  13. 20. Magento 创建新闻模块(1)
  14. ArrayList Vector
  15. 如何结束vbs的代码
  16. stm32-sbus数据接收,并通过CAN转发给车辆控制
  17. Java学习资料的汇总
  18. 用flashAS3.0做一个连线题
  19. 华为加油!海思加油!翻过这座山,你就是传奇
  20. 加性高斯白噪声信道:MATLAB小例题

热门文章

  1. word2vec的基础知识
  2. 如何封装一个vue组件(获取手机验证码的组件)
  3. 戴尔服务器 Dell R730服务器 Raid5配置
  4. Excel怎么转换PDF文件?
  5. 广州地区5G覆盖查询
  6. 好用点的电脑便签有哪些
  7. 霍尔传感器测距应用和磁铁的选择
  8. rt5370驱动移植
  9. python模拟足球射门_使用PyQt5的动画功能实现足球射门效果
  10. Go 性能优化之pprof 实战