ios 事件传递和响应的总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangzuanyi/article/details/71617319

● 如果某视图的pointInside:withEvent:返回YES,并且它的所有子视图hitTest:withEvent:都返回nil,或者该视图没有子视图,那么该视图的hitTest:withEvent:返回自己self。

      ● 如果子视图的hitTest:withEvent:返回非空对象,那么当前视图的hitTest:withEvent也返回这个对象,也就是沿原路回退,最终将hit-test view传递给keyWindow进行响应。

      ● 以下视图的hitTest-withEvent:方法会返回nil,导致自身和其所有子视图不能被hit-testing发现,无法响应触摸事件:

隐藏(hidden=YES)的视图;

禁止用户操作(userInteractionEnabled = NO)的视图;

alpha<0.01的视图;

视图超出父视图的区域;

-- 既然系统通过hitTest:withEvent:做传递链取回hit-test view,那么我们可以在其中一环修改传递回的对象,从而改变正常的事件响应链。

2.触摸事件的传递是从父控件传递到子控件。即树状结构的根节点向叶子节点递归传递。

也就是说,如果父控件不能接收触摸事件那么子控件就不可能接收到触摸事件。


3.事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(子控件到父控件)。


4.对于一个View,hitTest为什么会调用两次?

因为一次是消息传递时,还有一次是响应时。分别是入栈出栈操作,父View先入栈,后出栈。


5.不管视图能不能处理事件,只要点击了视图就会产生事件,关键看该事件是由谁来处理。也就是说,如果视图不能处理事件,点击视图,还是会产生一个触摸事件,只是该事件不会由被点击的视图处理而已。


6. 如果设置父控件的透明度或者hidden,会直接影响到子控件的透明度的hidden,如果父控件的透明度为0或者hidden=YES,那么子控件也是不可见的。同上1.


7.技巧:想让谁成为最合适的view就重写谁自己的父控件的hitTest:withEvent:方法返回指定的子控件(我下面会实现该案例),或者重写自己的hitTest:withEvent:方法return self. 但是,建议在父控件的hitTest:withEvent:中返回子控件作为最合适的view。


8.return nil的含义:

hitTest:withEvent:中return nil的意思是调用当前的hitTest:withEvent:方法的view不是合适的view,子控件也不是合适的view。如果同级的兄弟控件也没有合适的view,那么最合适的view就是父控件。


9.[self.view convertPoint:point fromView:self] 

把self.view的坐标系从self转换到自己的坐标系。然后就可以通过手动调用pointInside来判断是否在某个view内。


展开阅读全文

没有更多推荐了,返回首页