基础概念
事件分类
- 触摸事件(Multi
Touch
events) - 加速计事件(
Motion
events) - 远程控制事件(
Remote Control
events)
响应者对象(UIResponder
)
- 在iOS中不是任何对象都能处理事件,
只有
继承了UIResponder
的对象才能接收并处理事件。我们称之为响应者对象
- UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件
UIResponder内部提供了以下方法来处理事件,
触摸
事件是重点
// 触摸事件【重点】 // 一根 或 多根手指【开始】触摸view,系统会自动调用view下面的方法 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; // 一根 或 多根手指在view上【移动】,系统会自动调用view下面的方法(随着手指的移动,会【持续】调用该方法) - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; // 一根 或 多根手指【离开】view,系统会自动调用view下面的方法 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; // 触摸【被打断】,某个系统事件(例如:电话呼入)会打断触摸过程,系统会自动调用view下面的方法,只在指定场景下才会调用 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; // 加速计事件 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event; - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event; - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event; // 远程控制事件,远程控制事件有多个【子事件】 - (void)remoteControlReceivedWithEvent:(UIEvent *)event;
UITouch
每根手指
对应一个UITouch对象
- UITouch的
作用
- 保存着跟手指相关的信息,比如触摸的
位置、时间、阶段
- 当手指移动时,系统会更新
同一个
UITouch对象,使之能够一直保存该手指的触摸位置 - 当手指
离开屏幕
时,系统会销毁
相应的UITouch对象
- 保存着跟手指相关的信息,比如触摸的
UITouch常用属性及方法
// 触摸所处的窗口 @property(nonatomic,readonly,retain) UIWindow *window; // 触摸所处的视图 @property(nonatomic,readonly,retain) UIView *view; // 【短时间】内点按屏幕的次数,可以根据tapCount判断单击、双击或更多的点击 @property(nonatomic,readonly) NSUInteger tapCount; // 时间戳,单位是秒;记录了触摸各个阶段的时刻,可以根据记录事件每个阶段的时刻来算出时间差 @property(nonatomic,readonly) NSTimeInterval timestamp; // 当前触摸事件所处的状态 @property(nonatomic,readonly) UITouchPhase phase; /** UITouchPhaseBegan(触摸【开始】) UITouchPhaseMoved(接触点【移动】) UITouchPhaseStationary(接触点【没有移动】) UITouchPhaseEnded(触摸【结束】) UITouchPhaseCancelled(触摸【取消】) */ /** * 返回触摸点在view上的位置 * 这里返回的位置是针对view的坐标系的(以view的左上角为原点(0, 0)) * 调用时传入的view参数为nil的话,则返回触摸点在UIWindow中的位置 */ -(CGPoint)locationInView:(UIView *)view; // 返回触摸点在view上的【前一个】位置 -(CGPoint)previousLocationInView:(UIView *)view;
UIEvent(事件对象)
- 每产生一个事件,就会产生一个UIEvent对象
作用:记录事件产生的
时刻和类型
// 事件类型 @property(nonatomic,readonly) UIEventType type; /** // 触摸事件 UIEventTypeTouches, // 加速计事件 UIEventTypeMotion, // 远程控制事件 UIEventTypeRemoteControl, */ // 子事件类型 @property(nonatomic,readonly) UIEventSubtype subtype; /** // 不包含任何子事件类型(从iOS3.0开始支持此事件) UIEventSubtypeNone = 0, // 摇晃事件(从iOS3.0开始支持此事件) UIEventSubtypeMotionShake = 1, // 远程控制子事件类型(从iOS4.0开始支持远程控制事件) // 播放事件,操作:停止状态下,【按一下】耳机线控中间按钮 UIEventSubtypeRemoteControlPlay = 100, // 暂停事件 UIEventSubtypeRemoteControlPause = 101, // 停止事件 UIEventSubtypeRemoteControlStop = 102, // 播放或暂停切换,操作:播放或暂停状态下,【按一下】耳机线控中间按钮 UIEventSubtypeRemoteControlTogglePlayPause = 103, // 下一曲,操作:【按两下】耳机线控中间按钮 UIEventSubtypeRemoteControlNextTrack = 104, // 上一曲,操作:【按三下】耳机线控中间按钮 UIEventSubtypeRemoteControlPreviousTrack = 105, // 快退开始,操作:【按三下】耳机线控中间按钮后【不要松开】 UIEventSubtypeRemoteControlBeginSeekingBackward = 106, // 快退停止,操作:【按三下】耳机线控中间按钮到了快退的位置【松开】 UIEventSubtypeRemoteControlEndSeekingBackward = 107, // 快进开始,操作:【按两下】耳机线控中间按钮后【不要松开】 UIEventSubtypeRemoteControlBeginSeekingForward = 108, // 快进停止,操作:【按两下】耳机线控中间按钮到了快进的位置【松开】 UIEventSubtypeRemoteControlEndSeekingForward = 109, */ // 事件发生的时间 @property(nonatomic,readonly) NSTimeInterval timestamp; // UIEvent还提供了相应的方法可以获得在某个view上面的触摸对象(UITouch) - (NSSet *)allTouches; - (NSSet *)touchesForWindow:(UIWindow *)window; - (NSSet *)touchesForView:(UIView *)view; - (NSSet *)touchesForGestureRecognizer:(UIGestureRecognizer *)gesture
touches和event参数
- 一次完整的触摸过程,会经历
3个
状态,取消事件只是在特定情况
下才会发生- 触摸
开始
-(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
- 触摸
- 一次完整的触摸过程中,
只会
产生一个
事件对象,4个触摸方法都是同一个
event参数 - 如果两根手指
同时
触摸一个view,那么view只会调用一次
touchesBegan:withEvent:方法,touches参数中装着2个
UITouch对象 - 如果这两根手指
一前一后
分开触摸同一个view,那么view会调用2次
touchesBegan:withEvent:方法,并且每次调用
时的touches参数中只包含一个
UITouch对象 - 根据touches中UITouch的
个数
可以判断出是单点触摸
还是多点触摸
注意点:
- iPhone开发中,要
避免
使用双击
事件 - 默认情况
不支持
多点触控,需要设置下面的属性// 对应Multiple Touch的属性 view.multipleTouchEnabled = YES;