通过UIViewController传递触摸

时间:2016-01-07 16:19:04

标签: ios iphone uiviewcontroller touch

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

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

4 个答案:

答案 0 :(得分:1)

正如您正确推断的那样,当您将一个视图控制器呈现在另一个视图控制器上时,呈现视图控制器的视图不在响应者链中。因此,所呈现的视图控制器视图中的触摸不能“落入”它。您必须以其他方式从显示的视图控制器的视图中路由您的消息。

答案 1 :(得分:1)

您无法访问以前的ViewController,用户无法通过触摸进行交互。属性modalPresentationStyle = .OverCurrentContext仅表示不会从视图层次结构中删除所显示内容下的视图。

答案 2 :(得分:0)

像这样创建子类

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() {
        viewDidLoad()

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

您还可以使用此机制将触摸委托给其他任何视图,无论它是否存在

答案 3 :(得分:0)

在我的情况下,我的两个视图控制器是互斥的,因此我只隐藏了顶部视图控制器。

相关问题