通过 UIViewController 传递触摸

Posted

技术标签:

【中文标题】通过 UIViewController 传递触摸【英文标题】:Pass touches through a UIViewController 【发布时间】:2016-01-07 16:19:03 【问题描述】:

我有一个视图控制器,我覆盖在另一个视图控制器之上。我只需要顶视图控制器,这样我就可以覆盖一个临时弹出通知,并且拥有一个覆盖的 VC 允许我在 UITableViewController 上呈现它,因为你不能直接将子视图添加到 tableview 控制器。

是否可以与底部视图控制器交互,而它有另一个视图控制器覆盖它。如果这是一个视图或窗口,您可以通过将用户交互设置为 false 或使用 hitTest 来实现,但这些方法都不适用于视图控制器。

【问题讨论】:

“覆盖”到底是什么意思?这些视图控制器之间是什么关系? VC1 调用 presentViewController(VC2)。 VC2 有 modalPresentationStyle = .OverCurrentContext, backgroundColour.clear。我想在 VC1 而不是 VC2 上注册。 vc2.view 是 vc1.view 的子视图吗? 没有。这不是子视图。 你的问题解决了吗? 【参考方案1】:

像这样创建子类

class TouchDelegatingView: UIView 
    weak var touchDelegate: UIView? = nil


    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
        guard let view = super.hitTest(point, with: event) else 
            return nil
        

        guard view === self, let point = touchDelegate?.convert(point, from: self) else 
            return view
        

        return touchDelegate?.hitTest(point, with: event)
    

然后在你的 ViewController 中设置视图类(你可以直接在 xib 中,或者在 loadView() 方法中)

并添加

class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()

        if let delegatingView = view as? TouchDelegatingView 
            delegatingView.touchDelegate = presentingViewController?.view
        
    

您也可以使用此机制将触摸委托给任何其他视图,不管它是否

【讨论】:

我想你想要super.viewDidLoad() 但是如果我们不能设置UIViewControllerUIView 怎么办。比如UITabBarController,我们没有办法替换UIView 我说得对吗,您想将UITabBarController 显示为另一个视图控制器上方的弹出窗口,并通过它传递到底层视图控制器?几乎无法为它绘制一个案例,但如果您仍然需要这样做,您可以尝试覆盖您希望触摸通过的每个选项卡。另一种方法是覆盖loadView 并装饰UITabBarController 的视图。请提供更多背景信息,以便我可以正确解决您的问题。

以上是关于通过 UIViewController 传递触摸的主要内容,如果未能解决你的问题,请参考以下文章

触摸后关闭弹出框

如何将触摸事件传递给 parentViewController?

Objective-c:将值从 AppDelegate 传递给 UIViewController

如何忽略触摸事件并将它们传递给另一个子视图的 UIControl 对象?

从另一个 UIViewController 呈现 UIViewController

事件传递和手势总结