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 比较特殊)。


参考他人链接总结一些自己的理解,如果错误请指正,大神勿喷!

原文链接 ://www.greatytc.com/p/8dca02b4687e

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容