background image

iOS Programming 

– 触摸事件处理

    iphone/ipad 无键盘的设计是为屏幕争取更多的显示空间,大屏幕在观看图片、文字、视频
等方面为用户带来了更好的用户体验。而触摸屏幕是

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 类,