您的位置:首页 > 产品设计 > UI/UE

UI高级之事件的响应者链

2015-08-16 11:45 357 查看
一、事件的响应

在上一篇博客里面讲解了 事件的分发实际上就是 一层一层的给视图发送消息 然后找到触摸点所在多视图。

那么当找到了视图之后事件又是怎么处理的呢?



在上一篇博客讲解了事件的分发,现在来看看事件的响应。

当我们点击了view2点时候,经过一系列的查找找到view2上发生了触摸事件,那么view2就接受到事件。

每个视图或者视图控制器都有4个触摸事件:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent
*)event (方法1)
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
(方法2)
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
(方法3)
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent
*)event(方法4)

参数:touches里面存储的是所有触摸的UITouch对象,UITouch对象有4个属性,tapcount 点击的次数 view 对象所属的视图 window 对象所属的窗口 phrase 在触摸过程中有一个触摸周期,开始
移动 结束 中途取消 可以根据phrase判断所处的状态。

UITouch *touch = [touches
anyObject];//获取触摸对象
UIView *view = [touch
view];
NSInteger tagCount = [touch
tapCount];

当我们点击开始的时候 系统会在分发找到到视图中调用方法1 、当我们点击之后在视图上移动时会调用方法2、手指离开屏幕的时候会调用方法3,当电话等优先级别高的事件来的时候会打断当前运行的程序,此时会调用方法4.

因此我们需要处理的任务可以放在这些方法里面实现。

现在我们假如不在view2的implement里面实现上面的任何一个事件方法,则系统会将这个事件一直往视图的父视图myview上传递,假如myview上面有实现上述四个方法中某一个或者多个,则myview这个视图将响应这个触摸事件,如果也一个都没实现那么,向myview的父视图window上传递,如果一个都没实现则继续向下一级传递,此时会传递给UIApplication 如果还是不能响应这个触摸事件,则把事件传递给APPdelegete 对象,如果还是不能实现的话,则系统会将这个触摸事件丢弃。

可以看到事件的传递的是一级一级往下传递的。不能响应则往下一级传递。

例如:在myview上添加一个点击手势 然后在view2 上点击

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer
alloc]initWithTarget:self
action:@selector(TapAction:)];

singleTap.numberOfTapsRequired =
1;

singleTap.numberOfTouchesRequired =
1;
[myview addGestureRecognizer:singleTap];
-(void)TapAction:(UITapGestureRecognizer*)gesture
{

nslog(@"单击");

}

输出的是 :单击

因为view2上没有处理这个手势 则会把这个手势事件传递给他的父视图 myview 而myview实现了这个手势处理事件。

手势:在苹果提供的框架里面封装了几个常用点手势





上面几个方法是经常用到的,特别是

requireGestureRecognizerToFail: 方法是解决手势冲突的关键 因为每个手势的响应时间 在不同的状态,因此有些在触摸就开始响应的会屏蔽在后面响应的,这时就需要用到这个函数来先让后面响应的识别失败才响应默认的开始就响应对手势。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: