iOS 事件响应和传递 总结

事件传递:

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

你可能感兴趣的:(iOS 事件响应和传递 总结)