关闭自定义弹出对话框

时间:2019-04-23 12:50:04

标签: swift

在其区域之外点击时,我需要关闭模式对话框。在情节提要中定义视图并按以下方式显示时,该视图会自动工作:

let storyboard = UIStoryboard(name: "Services", bundle: nil)
let pinCodeController = storyboard.instantiateViewController(withIdentifier: "PinCodeController")

pinCodeController.modalPresentationStyle = .popover
pinCodeController.preferredContentSize = CGSize(width: 200, height: 300)

let presentationController = pinCodeController.popoverPresentationController
presentationController?.sourceView = pinCodeButton

self.present(pinCodeController, animated: true)

但是,由于我不使用情节提要,所以我几乎使用相同的代码来表示我的观点。这段代码显示了视图,但是在其边界之外点击时不会消失。

popoverFromSourceController.modalPresentationStyle = .popover
popoverFromSourceController.preferredContentSize = CGSize(width: 200, height: 300)

let presentationController = popoverFromSourceController.popoverPresentationController
presentationController?.sourceView = self.popoverFromSourceViewButton

present(popoverFromSourceController, animated: true)

谁能看到差异是什么,以及为什么行为不同?我是否需要以某种方式将click事件添加到基础视图以关闭弹出窗口?

我有一个相同的问题,尽管从UIBarButtonItem呈现相同的弹出窗口时有些不同。我的导航控制器有两个条形按钮,当通过第一个按钮显示对话框时,单击第二个按钮后它将自动关闭。但是,单击主视图不会关闭该对话框。

完整的源代码:https://github.com/igunther/CleanController

有人吗?

更新

添加了此代码,但仍然无法正常工作:

popoverFromSourceController.isModalInPopover = false

2 个答案:

答案 0 :(得分:1)

供将来的读者使用:所呈现的代码很可行,因为首先是哑光注释。问题是模拟器无法运行,需要重新启动。结案了。

答案 1 :(得分:0)

我想知道-您是否尝试过使用UITapGestureRecognizer实现该行为?

例如:

func viewDidLoad() {
  let dismissTapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissPopover(_:)))

  view.addGestureRecognizer(dismissTapGesture)
}


// This is invoked if the user taps anywhere outside the modal bounds. 

@objc func dismissPopover(_ sender: UITapGestureRecognizer) {
  if sender.state == UIGestureRecognizerState.Ended {
      let point = sender.location(in: view)

      if !self.view.frame.contains(point) {
          // We have tapped outside the popover
      }
  }
}

我尚未测试此代码,但它应该可以正常工作。另外,也可以尝试将手势识别器添加到显示弹出窗口的VC中,而不是在弹出窗口视图上添加手势识别器。 希望这会有所帮助!