多级 UIView(xib 类型)不触发 UITapGestureRecognizer
Posted
技术标签:
【中文标题】多级 UIView(xib 类型)不触发 UITapGestureRecognizer【英文标题】:Multiple levels UIView (xib type) not trigger UITapGestureRecognizer 【发布时间】:2016-03-11 02:25:31 【问题描述】:我想动态加载一些UIView
s,它们有些复杂,所以我花了几个小时制作了 .xib 文件。
现在假设我有一个finalView
,它作为根/容器视图显示在屏幕上。
然后我addSubView(subViewLvOne)
,也可以是容器视图。
终于subViewOne.addSubView(subViewLvTwo)
,现在我们得到了所有需要的东西。
在屏幕上它是完美的,正是我想要展示的结果。 Two
内One
,One
内final
。
但我无法使用One
和Two
获得任何点击事件。看来final
得到了所有的事件,但是由于里面有很多小的子视图,我当然希望他们得到自己的事件。
我已经简化了我的真实情况,避免了许多不相关的细节,希望现在描述清楚。
欢迎任何建议,甚至像“使用 *** 比 .xib 更好”。我自己,已经开始怀疑整个解决方案的方向了。
【问题讨论】:
它应该会自动工作,当你点击查看Two
时,与之关联的UITapGestureRecognizer
应该是有效的。
你设置了 view.userinteractionenabled = true 吗?
@SaiCYLi 是的,我已经尝试过 true 和 false ,结合每个 UIView。
尝试 3 个不同的视图向视图控制器添加 3 个不同的操作,你得到了什么结果?
【参考方案1】:
大约 2 小时后,我得到了两个提示:
-
.xib 文件中的根
UIView
,必须足够大。
我有一个宽度为 200 的UIView
,里面有一个UIButton
。在运行时,我将UIButton
的宽度约束更改为填满屏幕,显然大于200。然后发生了一些荒谬的事情:只有部分按钮可以触发点击事件。在这种情况下,根UIView
的宽度,即200像素。
init(frame:CGRect)
时,使宽高值足够大。
首先,我从网上的一些例子中复制了CGRect.Zero
。我的同事发现这会阻止点击事件。你可以只给一个1000宽和1000高,外面的区域不会真正触发点击事件,同时UIView
可以被正确点击。
就是这样。
【讨论】:
以上是关于多级 UIView(xib 类型)不触发 UITapGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章
Swift Xib UiView BottomSheet 被多次调用
XIB 中的 UIView 子类不显示(drawRect:从未调用)