如果放置在两个视图之间,UIButton 不会触发动作

Posted

技术标签:

【中文标题】如果放置在两个视图之间,UIButton 不会触发动作【英文标题】:UIButton not triggering action if place between two views 【发布时间】:2017-01-11 13:50:30 【问题描述】:

我有一个链接到通讯员@IBAction 的 UIButton。这样的按钮正好位于两个相邻视图的中间

|--------------|----------------| | view1 | button | view2 | |--------------|----------------|

UIButton 是 view1 的子视图(很重要!),但它位于中间,使用 'x' 位置为负值的框架。

两个视图都有一个 UITapGestureRecognizer,用来触发一些东西。

问题如下:如果我点击按钮的左侧(view1 上的那个),则会触发 IBAction,而如果我点击按钮的右侧部分(view2 上的那个),则 IBAction 是未触发,而 view2 上的 UIGestureRecognizer 是。

我知道这可能是因为按钮属于view1而不是view2,但是有没有办法检测到呢?

我尝试了建议的方法

override func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool 
   /*detect if you tapped button or view*/

它被正确调用,但总是说点击的视图是view2。

谢谢

【问题讨论】:

【参考方案1】:

我建议你使用两个按钮,让它们看起来像一个,view1 和 view2 上的每个按钮都靠得更近。如果按钮上有标题,则在按钮后面有一个标签,与 view1 上的当前按钮具有相同的框架,并将两个按钮的背景颜色设为 clearcolor。为两个按钮保持相同的目标和选择器。简单易行。

【讨论】:

【参考方案2】:

确保在您的故事板中,按钮位于视图上方,请参见随附的屏幕截图,其中按钮位于 textField 上方。

【讨论】:

【参考方案3】:

您的按钮可能被您的其他视图之一覆盖,因此这些视图正在吞噬水龙头。我建议运行您的应用程序并使用调试菜单的视图调试选项来查看视图的层次结构。我现在不在我的 Mac 上,所以我不能给你具体的命令,但是有一个菜单选项可以暂停你正在运行的应用程序并显示你的从后到前视图层次结构的 3d 表示。弄清楚这样的事情是非常宝贵的。

【讨论】:

【参考方案4】:

如果您的按钮是 view1 的子视图,则在 view1 范围之外的点击不会注册。这就是为什么您可以点击左侧,但不能点击右侧。

最好让view1、view2和button子成为同一个superview,并确保button被添加在两个view之上。

【讨论】:

谢谢,这也是我的主意。问题是 view1 和 view1 实际上是滚动视图的单元格:(

以上是关于如果放置在两个视图之间,UIButton 不会触发动作的主要内容,如果未能解决你的问题,请参考以下文章

iOS - UIPageControl 上的 UIButton 不起作用

对于以编程方式创建的 UIButton,有时不会触发按钮单击事件

第一个 UIButton 触发同一视图的另一个 UIbutton 事件

修改两个右 UIBarButtonItems 之间的间距

如果我使用 CALayer 绘制 UIButton 不会触发选择器

UIButton 无法正确显示