您的位置:首页 > 移动开发 > IOS开发

iOS学习笔记05-触摸事件

2016-04-04 10:46 357 查看

一、事件分发处理【由外到内】

在iOS中发生触摸后,事件会加到
UIApplication
事件队列,
UIApplication
会从事件队列取出最前面的事件进行分发处理,通常会先分发给主窗口,主窗口会调用
hitTest:withEvent:
方法,查找适合的事件触发视图,即 找到被触摸的视图对象

寻找流程如下:

在顶级视图(keyWindow的视图)上调用
pointInside:withEvent:
方法判断触摸点是否在当前视图内;

如果返回NO,那么keyWindow的
hitTest:withEvent:
返回nil;

如果返回YES,那么它会向当前视图的所有子视图发送
hitTest:withEvent:
消息,遍历所有子视图的顺序是从subviews数组的末尾向前遍历(从界面最上方开始向下遍历);

如果有subview的
hitTest:withEvent:
返回非空对象,则keyWindow的
hitTest:withEvent:
返回此对象,处理结束;

如果所有subview遍历结束仍然没有返回非空对象,则keyWindow的
hitTest:withEvent:
返回顶级视图;

二、响应者链条【由内到外】

找到被触摸的视图对象后,还需要判断该视图对象是否能处理该触摸事件,如果不能处理,又该让谁来处理,于是响应者链条出现,作用是 找到事件响应者



响应者链条原则:

触摸对象
initalView
无法响应事件时,传递给上级视图
superView
去响应

如果上级视图无法响应,继续往上传递

往上传递直到传递到视图控制器的根视图
controllerView
,如果根视图不响应,传递给视图控制器
viewController


视图控制器不响应,传递给父视图控制器的根视图
superControllerView
,如果根视图不响应,传递给父视图控制器
superViewController


顶级视图控制器不能响应,传递给主窗口
keyWindow


keyWindow
不能响应,传递给
UIApplication
处理

UIApplication
不能响应,该事件就会被 抛弃

三、继承UIResponder

以上 事件分发响应者链条 ,都不需要我们关心,这些操作是自动执行的,不需要我们去操作,我们只需要了解它们的原理就行。

在iOS中并不是所有的类都能处理并接受事件,只有继承
UIResponder
的对象才能处理事件(我们常用的
UIView
UIViewController
UIApplication
都继承自
UIResponder
,它们都能接收并处理事件 ),但继承
UIResponder
又不意味着一定能处理事件

继承 UIResponder 的对象,不能处理事件的情况:

userInteractionEnabled = NO;


hidden = YES;


alpha = 0 ~ 0.01;


没有实现
touchesBegan:withEvent
方法

重写UIResponder 触摸响应方法:
#pragma mark 触摸开始时会调用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 触摸移动时会频繁调用
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 触摸结束离开屏幕时会调用
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 触摸意外取消时会调用,比如触摸时电话打进来
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

四、UITouch对象

在 UIResponder 触摸响应方法中,需要获取 UITouch 对象:
//取得一个触摸对象(对于多点触摸可能有多个对象)
UITouch *touch = [touches anyObject];
//取得在指定视图的触摸位置
CGPoint current = [touch locationInView:self.view];
//取得在指定视图的前一个触摸位置
CGPoint previous = [touch previousLocationInView:self.view];

其他常用属性:

window : 触摸所在窗口

view : 触摸所在视图

tapCount : 短时间点击次数

了解了这些,你就可以利用触摸事件做一些好玩的事情了,(^o^)/~,这里就不列具体代码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: