入坑
因为项目的一个新需求
遂复用了一个自定义的视图
这个视图里面有一个UITableView
就在万事俱备
准备走一波的时候~ 🐥
神奇的事情又发生了~ 😉
列表里面的Cell
居然点了没反应??
Cell
有个点击效果
明白人都清楚
我2只大眼睛
👀 都已经看到这个效果了
但是代理函数就是没响应?
心中一万只草泥🐴奔腾而过 ~_ ~_ ~_
令我无法相信的事实是
这个视图在A处完全没有
任何问题
然而此时在B处,却完全不起任何作用 😉
一毛一样的代码
我只能猜想
于是我开始一点一点排查
…
半个小时过去了
十万只草泥🐴
…
一个小时过去了
我开始网上查找相似案例
…
一个半小时过去了
我开始在开发群里面求助
…
无数只草泥🐴
怀疑
我起身去厕所
就是想去厕所冷静了下
别想歪了
吃翔是解决不了问题的 😉
抛下当前的纠结
闭上眼睛
开始在脑海里游荡
在知识的海洋里寻找答案
不同之处是应该是它所处的环境造成的
当点击无效时
我脑海里出现了手势冲突
这个概念
很快!
我的猜想得到了验证
果然是被一个手势
拦截了
啊 😉
草泥🐴一波接一波 ~_ ~_ ~_
谁能想到
在某个地方会存在这么个东西 🐥
验证
我开始新建了一个项目
开始进一步验证
先上一张图
俗话说
“没图你说个🐥”
在控制器ViewController的view
上添加一个自定义的视图aview
这个aview
有3个子视图:backView
、backButton
、contentView
contentView
有1个子视图:tableView
上面的图已经列出的层级关系
并且个别视图添加了手势
以及事件
如果上面的图飞走了
就直接看下面的文字吧
/* 层级结构
ViewController
|---view (UIView) 添加了点击手势
|---AView (UIView) 未添加
|----backView (UIView) 添加了点击手势
|----backButton (UIButton) 添加了Target-Action
|----contentView (UIView) 未添加
|----tableView (UITableView) 未添加
问题:
点击 contentView 和 tableViewcell
最顶层的 view 会响应事件
*/
contentView
与 tableView
未添加手势
当点击它们的时候
最顶层的 view
的点击事件响应
了
所以导致cell
点击了也没反应
之前我尝试用2个手指点击
cell
居然是有反应的! 震惊 😱
当我点击aview
时,它也没有添加手势
此时,还是最顶层的 view
的点击事件响应
了
当我点击backView
、backButton
时
它们2个的事件都能响应!
于是我在aview
上添加了手势
再次点击时,aview
响应事件了
这个时候再来看contentView
与 tableView
当我点击它们2个时,aview
响应事件了
继续在contentView
上添加手势
此时点击tableView
时
contentView
响应事件了
于是有了下面的解决方案之一
结论:
子视图
的手势和事件,会覆盖父视图
的手势
但是父视图
的手势,会覆盖子视图
的UITableViewCell
的事件
这UITableViewCell
的事件,怎么它的等级就这么低呢 😉
填坑结束
捏了一把汗😓
方案
-
解决方案1
给 cell 也添加 点击手势
-
解决方案2
把自定义的视图添加到当前视图的window
上
[self.aview showInView:self.view.window];
这第2个方案是怎么想到的呢?
也许是代码写多了
自然就会了吧 😃
仓库
你可以自己下载项目,来体验一番~
https://github.com/xjh093/TapGestureAndUITableView