iOS 当手势遇上UITableView,会发生哪些奇妙的事?

入坑

因为项目的一个新需求
遂复用了一个自定义的视图
这个视图里面有一个UITableView

就在万事俱备
准备走一波的时候~ 🐥
神奇的事情又发生了~ 😉

列表里面的Cell居然点了没反应??
Cell 有个点击效果
明白人都清楚
我2只大眼睛 👀 都已经看到这个效果了
但是代理函数就是没响应?
心中一万只草泥🐴奔腾而过 ~_ ~_ ~_

令我无法相信的事实是
这个视图在A处完全没有任何问题
然而此时在B处,却完全不起任何作用 😉

一毛一样的代码
我只能猜想
于是我开始一点一点排查

半个小时过去了
十万只草泥🐴

一个小时过去了
我开始网上查找相似案例

一个半小时过去了
我开始在开发群里面求助

无数只草泥🐴


怀疑

我起身去厕所
就是想去厕所冷静了下
别想歪了
吃翔是解决不了问题的 😉

抛下当前的纠结
闭上眼睛
开始在脑海里游荡
在知识的海洋里寻找答案

不同之处是应该是它所处的环境造成的
当点击无效时
我脑海里出现了手势冲突这个概念
很快!
我的猜想得到了验证
果然是被一个手势拦截了
啊 😉
草泥🐴一波接一波 ~_ ~_ ~_

谁能想到
在某个地方会存在这么个东西 🐥


验证

我开始新建了一个项目
开始进一步验证
先上一张图
俗话说
“没图你说个🐥”

在这里插入图片描述
在控制器ViewController的view上添加一个自定义的视图aview
这个aview有3个子视图:backViewbackButtoncontentView
contentView有1个子视图:tableView
上面的图已经列出的层级关系
并且个别视图添加了手势以及事件

如果上面的图飞走了
就直接看下面的文字吧

/* 层级结构
 ViewController
 |---view (UIView)                     添加了点击手势
     |---AView (UIView)                未添加
          |----backView (UIView)       添加了点击手势
          |----backButton (UIButton)   添加了Target-Action
          |----contentView (UIView)    未添加
                |----tableView (UITableView) 未添加
 
 问题:
 点击 contentView 和 tableViewcell
 最顶层的 view 会响应事件
 */

contentViewtableView 未添加手势
当点击它们的时候
最顶层的 view 的点击事件响应
所以导致cell点击了也没反应
之前我尝试用2个手指点击
cell居然是有反应的! 震惊 😱

当我点击aview时,它也没有添加手势
此时,还是最顶层的 view 的点击事件响应

当我点击backViewbackButton
它们2个的事件都能响应!

于是我在aview上添加了手势
再次点击时,aview响应事件了
这个时候再来看contentViewtableView
当我点击它们2个时,aview响应事件了

继续在contentView 上添加手势
此时点击tableView
contentView响应事件了

于是有了下面的解决方案之一

结论:
子视图的手势和事件,会覆盖父视图的手势
但是父视图的手势,会覆盖子视图UITableViewCell的事件
UITableViewCell的事件,怎么它的等级就这么低呢 😉

填坑结束
捏了一把汗😓


方案

  • 解决方案1
    给 cell 也添加 点击手势

  • 解决方案2
    把自定义的视图添加到当前视图的window
    [self.aview showInView:self.view.window];

这第2个方案是怎么想到的呢?
也许是代码写多了
自然就会了吧 😃


仓库

你可以自己下载项目,来体验一番~
https://github.com/xjh093/TapGestureAndUITableView


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪冷啊

你的鼓励是对我的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值