码迷,mamicode.com
首页 > 移动开发 > 详细

iOS中的事件处理--续篇

时间:2015-07-13 06:34:53      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:事件处理   ios   响应   hittest   响应者链   

1. 图解iOS事件处理的流程

技术分享

1.当触摸屏幕的时候,由操作系统捕获响应的消息,并且将消息放进UIApplication管理的队列中。
2.从UIApplication中取出消息交给UIWindow,UIWindow做出以下判断:

  1. 判断自己能不能接收事件
  2. 点在不在自己窗口上
  3. 遍历自己的子控件,找比自己更合适的View
  4. 子控件接收,继续上面的步骤;子控件不接收,窗口自己处理事件

3.直到找到最合适的yellowView,此时事件传递结束,然后反向执行响应者链条。
4.touch的默认做法:自己不处理,交给上一个响应者。上一个响应者默认是父控件。可以通过重写touch方法来处理响应的点击事件,重写的方法如果不调用父类的方法,则响应者链结束,调用则继续往下走。

2. 详解hitTest:withEvent:方法

2.1 hitTest: withEvent: 的作用

- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event
1. hitText什么时候调用:当一个事件传递给一个控件的时候,控件就会调用这个方法
2. hitText作用: 寻找到最合适的view。
3. 事件传递,UIApplication -> UIWindow。UIWindow去寻找最合适的view? [UIWindow hitTest:withEvent:]里面做了什么事情?

  1. 判断窗口能不能处理事件? 如果不能,意味着窗口不是最合适的view,而且也不会去寻找比自己更合适的view,直接返回nil,通知UIApplication,没有最合适的view。
  2. 判断点在不在窗口
  3. 遍历自己的子控件,寻找有没有比自己更合适的view
  4. 如果子控件不接收事件,意味着子控件没有找到最合适的view,然后返回nil,告诉窗口没有找到更合适的view,窗口就知道没有比自己更合适的view,就自己处理事件。

2.2 实现 hitTest: withEvent:

实现思路:
1. 判断自己能不能接收事件
2. 判断点在不在自己窗口上
3. 遍历自己的子控件,找比自己更合适的View

// point:是方法调用者坐标系上的触摸点的位置
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 1.判断下能否接收触摸事件
    if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.0) return nil;

    // 2.判断下点在不在控件上
    if ([self pointInside:point withEvent:event] == NO) return nil;

    // 3.从后往前遍历子控件
    int count = (int)self.subviews.count;

    for (int i = count - 1; i >= 0 ; i--) {
        // 取出显示在最前面的子控件
        UIView *childView =  self.subviews[i];

        // 转换成子控件坐标系上点
        CGPoint childP = [self convertPoint:point toView:childView];

        UIView *fitView = [childView hitTest:childP withEvent:event];

        if (fitView) {
            return fitView;
        }

    }
    // 表示没有比自己更合适的view
    return self;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS中的事件处理--续篇

标签:事件处理   ios   响应   hittest   响应者链   

原文地址:http://blog.csdn.net/supersonico/article/details/46856311

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!