子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件

Posted

技术标签:

【中文标题】子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件【英文标题】:Child UIViewController view prevents container UIViewController views from receiving touch events 【发布时间】:2018-09-12 11:14:36 【问题描述】:

我在主 UIViewController 中有一个地图和一些按钮,在子 UIViewController 中有一个弹出视图。问题是子 UIViewController 的主视图阻止主按钮和地图接收任何触摸事件!

结构如下:

主 UIViewController 查看 地图视图 用户界面按钮 子 UIViewController 查看 弹出 UIView 按钮

编辑: 此代码通过所有事件,但我不需要停止弹出 UIView 和按钮事件

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool 
print("Passing all touches to the next view (if any), in the view stack.")
return false

【问题讨论】:

***.com/questions/3834301/… @BencePattogato 当我这样做时,mapview 注释停止接收任何触摸事件 我认为,您将控制权交给了 childVC,这会阻止您的 mainVC。 你是说这个“弹出视图”覆盖了主视图上的可点击按钮吗?在我看来,这是一个 UI 问题,而不是事件问题。在这种情况下,我可以想到三个选项。 (1) 使您的“弹出”视图可移动,即使这在 ios 应用程序中通常看不到。 (2) 使您的“弹出窗口”可关闭,并让用户决定要点击什么。 (3) 使你的“弹出”静态/固定,不要在它下面隐藏东西。现在...如果您的问题是“弹出”中发生的事件没有被底层 VC 看到,请让底层 VC 成为弹出窗口的代表。 我刚刚更新了问题以澄清当前情况 【参考方案1】:

根据@BencePattogato 的回答,这段代码解决了我的问题。谢谢

class UnTouchableView: UIView 
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool 
        return subviews.contains(where: 
            !$0.isHidden && $0.point(inside: self.convert(point, to: $0), with: event)
        )
    

【讨论】:

以上是关于子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

子视图控制器的视图未显示在容器中

为啥 UIView 的这些自动布局约束会阻止 UIButton 子视图接收触摸事件?

如何在具有自动布局的容器视图中将 UITableView 的大小设置为子视图

在主视图控制器的子容器视图中获取tableView的引用

子容器视图中的 UILabel 未更新

Subview没有使用容器的完整视图