IOS事件:触摸,加速计,远程控制
1.触摸:
响应者对象:继续了UIResponder的对象(UIApplication,UIViewController,UIView)
方法:
手指摸:touchesBegan
手指移动:touchesMoved
手指离开:touchesEnded
触摸结束前,系统事件打断触摸过程:touchesCancelled
touches:默认是有一个Touch对象,视图上一个手指对应一个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;
// 方法:
-(CGPoint) locationInView(UIView*)view:
返回值表示触摸在view上的位置(获得当前的CGPoint)
这里的返回的位置是针对view的坐标系的(以view左上角为原点(0,0))
调用时传入参数为nil的话,返回的是触点在UIWindow的位置
-(CGPoint) previousLocationInView:(UIView*)view:
前一个触摸点的位置
2.事件的产生和传递:(事件加入在由UIApplication管理的队列,先进先出)
1>传递:父控件 --> 子控件(第一个接收事件的控件是:UIWindow)
目的:找到最合适的view,把事件交给他
2>如果父控件不能接收触摸事件,那么子控件也不能接收触摸事件。
3>不能接收的情况:
A. userInteractionEnabled = NO(不允许用户交互)
B. hidden = YES (控件隐藏)
C. alpha = 0.0- 0.01 (完全透明)
4>底层(思路):(找到最合适的view)
触摸后
->UIApplication
->主窗口去找最合适的view 1>自己是否能接受触摸事件,否,传递结束
2>触点是否在自己身上,否,传递结束
3>从后往前遍历子控件,重复以上步骤
4>如果没有符合条件的子控件,那么就自己最适合处理
5>底层(代码):
产生触摸事件-> UIApplication -> UIWindow(让窗口寻找最合适的view)
- (UIVIew *) hitTest:withEvent:
作用:寻找最合适的view,判断当前点在不在方法调用者控件上
调用:当一个事件传递给一个控件的时候就会调用
// 判断控制器是否能接收事件
如果:userInteractionEnabled = NO ,hidden = YES ,alpha = 0.0- 0.01 返回nil
// 判断触摸点在不在当前控件上
! pointInside :point withEvent:event 返回nil
// 从后往前遍历当前控件的的子控件
- (BOOL) pointInside
作用:判断这个点在不在方法调用者 (self) 的坐标系上面
3.响应者链条(由多个响应者对象组成)
1>touches方法的
默认做法将事件顺着
响应者链条向上传递,将事件交给上一个响应者进行处理
2>作用:能清楚的看见每个响应者之间的联系,并且可以让一个事件对应多个对象处理
响应者对象:能处理事件的对象
3>事件传递的完整过程:
A. 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事情
B. 调用最合适控件的touches...方法
C.如果调用了[super touches…]; 就会将事件顺着响应者链条往上传递,传递给上一个响应者
D.接着就会调用上一个响应者的touches...方法
4> 判断上一个响应者的方法:
A.如果这个view时控制器的view,那么
控制器就是上一个响应者
B.如果当前这个view不是控制器的view,那么它的
父控件就是上一个的响应者
5>响应者事件传递过程:
A.如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其床底给他的父控件。
B.在视图层次结构最顶级视图,如果也不能处理收到的事件或者消息,则将事件或消息传递给UIWindow对象进行处理。
C.如果UIWindos也不能处理,则将事件或者消息传递给UIApplication对象
D.如果UIApplication也不能处理事件或者消息,则将其丢弃。