将触摸事件通过一个UIViewController传递

14

我有一个视图控制器,可以在另一个视图控制器的上方覆盖。我只需要顶部的视图控制器,这样我就可以覆盖临时弹出的通知,而覆盖的VC允许我在UITableViewController上呈现此内容,因为您无法直接添加子视图到tableview控制器中。

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


你所说的“covering”具体是什么意思?这些视图控制器之间有什么关系? - matt
vc2.view 是 vc1.view 的子视图吗? - lzl
不是子视图。 - Mark Bridges
1
你解决了你的问题吗? - Georg
@MarkBridges,下面的Tiran答案很完美,如果你还在的话可能需要打个勾! - Fattie
显示剩余2条评论
1个回答

20

像这样创建子类

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
        }
    }
}

你也可以使用这种机制将触摸委托给任何其他视图,无论它是什么


1
无论是什么,都没有关系? - Peter Mortensen
抱歉,我不记得了。你可以忽略那个。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接