我有一个视图控制器,我覆盖在另一个视图控制器之上。我只需要顶视图控制器,这样我就可以覆盖一个临时弹出通知,并且有一个覆盖的VC允许我通过UITableViewController呈现这个,因为你无法直接向tableview控制器添加子视图。
是否可以与底部视图控制器进行交互,同时它有另一个视图控制器覆盖它。如果这是一个视图或窗口,您可以通过将用户交互设置为false或使用hitTest来实现此目的,但这些方法都不适用于视图控制器。
答案 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)
在我的情况下,我的两个视图控制器是互斥的,因此我只隐藏了顶部视图控制器。