事件传递:
1.首先 UIApplication 获取事件存放到事件队列中,因为事件队列是先进先出,不能放到栈内(栈是一个整体连续的内存,先进去被压到栈底了)所以是先进后出。
2.UIApplication 把事件传给UIWindown ,UIWindown 通过
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
和 - (Bool)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
通过遍历subViews寻找合适的子控件;
3.找到正确合适的子控件之后让子控件处理事件,还会继续往下传递:直到全部寻找完为止。
特别注意点:如果父视图不合适,自视图一定不合适(子视图的frame 超出父视图,此时点击子视图,父视图的传递链会被断掉,原因就是因为
- (Bool)pointInside:(CGPoint)point withEvent:(UIEvent *)event 判断返回为NO。
事件响应机制:恰恰与传递相反,从最上层的响应对象开始调用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@“做自己的事情”);
[super touchesBegan:touches withEvent:event];传给父类让父类继续做事情。
如果只要当前类响应,那么不调用父类方法,这样响应链也就断掉了。
}
处理完当前对象的事件之后可以调用 [super touchesBegan:touches withEvent:event]; 把事件响应传给下一个响应者(一般情况来说,父视图就是子视图的下一个响应者,如果是ViewController 那么 vc的view的响应者就是VC 比较特殊)。
参考他人链接总结一些自己的理解,如果错误请指正,大神勿喷!
原文链接 :http://www.jianshu.com/p/8dca02b4687e