多级 UIView(xib 类型)不触发 UITapGestureRecognizer

Posted

技术标签:

【中文标题】多级 UIView(xib 类型)不触发 UITapGestureRecognizer【英文标题】:Multiple levels UIView (xib type) not trigger UITapGestureRecognizer 【发布时间】:2016-03-11 02:25:31 【问题描述】:

我想动态加载一些UIViews,它们有些复杂,所以我花了几个小时制作了 .xib 文件。

现在假设我有一个finalView,它作为根/容器视图显示在屏幕上。 然后我addSubView(subViewLvOne),也可以是容器视图。 终于subViewOne.addSubView(subViewLvTwo),现在我们得到了所有需要的东西。

在屏幕上它是完美的,正是我想要展示的结果。 TwoOneOnefinal

但我无法使用OneTwo 获得任何点击事件。看来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 大小不正确

使用 XIB 加载的 UIView 按钮不起作用

XIB 中的 UIView 子类不显示(drawRect:从未调用)

如何将额外参数传递给链接到 XIB 文件的自定义 UIView?

在 XIB 中连接 UIView 并使用 Story board 中的 View Controller 加载它