【问题标题】:How to dismiss modal form sheet when clicking outside of view?单击视图外部时如何关闭模式表单?
【发布时间】:2016-10-09 11:49:56
【问题描述】:

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

我在我的 iPad 应用程序中显示一个模态表单弹出窗口。为了关闭这个视图,我添加了一个关闭它的按钮。但是我真正想要的是当您在视图之外单击时它会消失。几乎与弹出框相同的行为。我尝试通过添加点击手势、使其成为弹出框、任何演示样式来实现这一点,但没有任何效果。

有没有人这样做,以便您可以指出正确的方向?

【问题讨论】:

标签: ios swift


【解决方案1】:

我必须在我的应用程序中显示一些屏幕,例如弹出窗口,所以我制作了如下所示的基类:

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 的第一行,否则它只会工作一次。
  • 如果弹出窗口没有被破坏,它会添加另一个手势记录。当用户打开弹出窗口时,这就是为什么我需要 self.view.window?.removeGestureRecognizer(sender)
  • let location = touch.location(in: self.view) 中,我不得不更改self.view 以使用我的特定视图,但在那之后,事情就按预期进行了。
猜你喜欢
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多