美文网首页iOS开发
iOS 事件响应机制-简略版

iOS 事件响应机制-简略版

作者: BlackStar暗星 | 来源:发表于2019-01-29 17:01 被阅读37次

之前去腾讯面试被问到事件响应机制相关的问题,那个时候还是什么都不懂得,去这种大公司面试一般都是抱着学习的态度取得,当然侥幸的心里还是有的,总会想着万一能行呢。结果吗。。。最起码学习到了很多东西,这波不亏。

iOS的事件响应必须是UIResponder的类及其子类,我们Command查看层级关系不难发现,UITextView,UILabel,UIButton等控件他们的基类都是UIResponder。这也是他们能够响应事件的基础。

我们需要了解下事件分发传递的流程 First Responser -- > The Window -- >The Application -- > App Delegate

  1. 触摸屏幕,系统生成event对象并将event加入到UIApplication管理的一个任务队列中
  2. 系统会遍历当前视图及子视图寻找最合适的响应者来执行event,那么系统如何能找到最合适的响应者成为了最关键的地方,他是怎么找到的,又是通过什么样的方法什么样的逻辑找到的呢,下面说一下具体的流程
  • 方法:hitTest 和 pointInside 方法

  • 逻辑: 递归判断

    • 手势触摸,系统会判断触摸点是否在当前视图上
    • 如果在,执行hitTest方法。同级子视图遍历规则遵循filo(先进后出)原则
    • 找到了这个view 然后执行event,从上往下一次执行,看是否能够执行,不能够执行,找他的同级视图或父视图
  • 三种情况下是不会响应事件

    • userInteractionEnabled = NO
    • hidden = YES
    • alpha < 0.01

实用案例,利用hitTest方法修改button按钮点击范围,点击范围扩大2倍

//重写button的hitTest方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    NSLog(@"====%@",NSStringFromCGPoint(point));
    CGRect rect = self.bounds;
    CGRect newRect = CGRectMake(-rect.size.width/2, -rect.size.height/2, rect.size.width*2, rect.size.height*2);
    if (CGRectContainsPoint(newRect, point)) {
        return self;
    }
    return nil;
}

相关文章

网友评论

    本文标题:iOS 事件响应机制-简略版

    本文链接:https://www.haomeiwen.com/subject/ehxajqtx.html