UI进阶第九发:触摸

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也不能处理事件或者消息,则将其丢弃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值