点击视图外部时如何关闭模态表单?

4

我不知道如何在Swift中实现以下功能:

我正在iPad应用程序中显示模态表单弹出窗口。为了关闭此视图,我添加了一个按钮来关闭它。但我真正想要的是在单击视图之外时关闭它。几乎与弹出菜单相同的行为。我尝试通过添加轻拍手势、使其成为弹出菜单、任何演示风格来实现这一点,但都没有成功。

是否有人可能已经做过这个,以便您可以指导我正确的方向?


这篇帖子展示了如何在今天实现它。 - LinusGeffarth
1个回答

12

我需要在我的应用程序中显示一些屏幕,比如弹出屏幕,因此我创建了一个基类,它看起来像这样:

class MyBasePopUp: UIViewController, UIGestureRecognizerDelegate {

var tap: UITapGestureRecognizer!
override func viewDidAppear(_ animated: Bool) {
    
    tap = UITapGestureRecognizer(target: self, action: #selector(onTap(sender:)))
    tap.numberOfTapsRequired = 1
    tap.numberOfTouchesRequired = 1
    tap.cancelsTouchesInView = false
    tap.delegate = self
    self.view.window?.addGestureRecognizer(tap)
}

internal func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

internal func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    let location = touch.location(in: self.view)
    
    if self.view.point(inside: location, with: nil) {
        return false
    }
    else {
        return true
    }
}

@objc private func onTap(sender: UITapGestureRecognizer) {
    
    self.view.window?.removeGestureRecognizer(sender)
    self.dismiss(animated: true, completion: nil)
}

这只是为了关闭弹出窗口,如果您有多个手势,请小心。


这基本上满足了我的需求。也许我使用它的方式略有不同,但在正确识别点击之前,我必须使用presentedViewController.view而不是self.view,并且我必须删除onTap的第一行,否则它只能工作一次。 - John Montgomery
1
如果弹出窗口没有被销毁,它将添加另一个手势识别器。当用户打开弹出窗口时,这就是为什么我需要self.view.window?.removeGestureRecognizer(sender)的原因。 - Shurtugal
let location = touch.location(in: self.view) 中,我必须更改 self.view 以使用我的特定视图,但之后,一切都按预期工作。 - David A

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