在其区域之外点击时,我需要关闭模式对话框。在情节提要中定义视图并按以下方式显示时,该视图会自动工作:
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
答案 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中,而不是在弹出窗口视图上添加手势识别器。 希望这会有所帮助!