在VC上加一个tableview,为什么touchesBegan方法没有触发

pointInside(),查找是从UIWindow开始,先判断是否点击点是否在自己的bounds内,如果是,往下遍历;hitTest(),最终返回的view,是逆向的,如果能响应点击,就把自己返回。

为什么没有响应点击
在VC上加一个tableview,为啥touchesBegan()没有触发?
tableview继承scrollview,scrollview默认取消touch的传递,所以父视图就不会响应touch了。

为什么VC的view上加了其他子视图,当点击子视图时,VC中的touchesBegan()被调用了?
答:因为子视图没有重写这个方法touchesBegan(),请参考下面的问题;

为什么uiview,重写了touchesBegan(),VC的touchesBegan()就不响应了?
答:子视图响应了touch,那么父视图touch就不会响应了。

TableView为什么不响应touchBegan

回到刚开始的问题,当我们点击TableView时,为什么touchBegan不响应呢?通过响应链我们不难想象到,当我们点击屏幕时,第一响应者应该是UITableView,而我们调用的touchBegan其实是ViewController的View的方法,所以无法被调用。
解决方法也很简单,我们可以给tableView写一个基类,重写tableview的touchBegan方法,通过block或者代理传出,然后继承基类,即可实现touchBegan的响应。


不过对于滚动视图的键盘回收,感觉还是`tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag`这样比较优雅,毕竟是系统提供的。 


作者:WhisperKarl
链接:https://www.jianshu.com/p/d77164f8cac5
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自www.cnblogs.com/dengchaojie/p/10288890.html