背景
最近要做一个页面形状如下

一看,非常简单。三个view就处理好了一个透明的view、一个灰色的view和透明view等大,一个蓝色的view 加在透明的view上底部和透明的view顶部对齐。
实践
按照之前的思路、简单做好、运行,样式正确。这个时候,要求点蓝色的地方要响应手势,于是UITapgestureRecognizer 初始化 添加。但是我发现手势不响应,
手势的响应过程大家都应该知道,比如有两个页面 A上有B 那么发生点击的时候,点击的位置开始从下向上找逐层传递手势事件,
也就是A把事件传给B,
然后从上向下逐个判断是否响应该手势,也就是先判断B是否响应该手势,如果响应则B处理,结束。如果不响应,则判断A是否响应。
于是。我开始找问题
找问题
首先。透明的View是最底层的它的范围是灰色区域,然后蓝色加在它的上面,那么点击蓝色的时候,会发生什事情,事件显然没有从透明View传给蓝色View,否则手势就会响应了,那么只能是没有传递,只通过addSubview加在上面还不行吗。返回头看一下书上的解释。发生点击的时候,点击的位置 开始从下向上找逐层传递手势事件, 注意是从点击的位置开始,当我点蓝色的区域的时候,蓝色区域位置下并没有透明的view 所以事件也不会响应。
但是,那换成ViewController行不行呢。透明的View和蓝色View都换成controller。 大家都知道我们的ViewController在添加子viewController的view到它自己的viewHierarchy之间必须通过addChildViewController的方式来关联两个ViewController,这是为了让iOS能够恰当的把事件传送给viewControllers和子controller的view,移除的时候也需要先将子controller的view从viewHierarchy移除,之后断开子controller和自身的关联。
依然是实践、运行,然后发现不行。事件的传递并不像想象中那样,两个ViewController的view不重叠,点击并不会触发子controller的手势。
结论
还是得多看文档,文档上没有字是平白无故写上去的,忽略哪一个,都是为自己挖坑
网友评论