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

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

 

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

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

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

TableView为何不响应touchBegan

回到刚开始的问题,当咱们点击TableView时,为何touchBegan不响应呢?经过响应链咱们不难想象到,当咱们点击屏幕时,第一响应者应该是UITableView,而咱们调用的touchBegan实际上是ViewController的View的方法,因此没法被调用。
解决方法也很简单,咱们能够给tableView写一个基类,重写tableview的touchBegan方法,经过block或者代理传出,而后继承基类,便可实现touchBegan的响应。blog


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

做者:WhisperKarl 连接:https://www.jianshu.com/p/d77164f8cac5 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。
相关文章
相关标签/搜索