我已阅读多个地方,并提供有关如何完成此操作的建议。我选择在后台添加UI视图并将其设置为禁用,然后在显示弹出窗口后,将视图设置为启用。
正如您所看到的,它看起来效果很好:
但我确实有两个问题。第一个是弹出窗口,你可以点击背景上的任何地方来解除弹出窗口。有没有可以阻止这种情况发生?我假设我的背景UIView会阻止任何输入。
此外,在弹出窗口被解除后,屏幕仍然暗淡。我尝试了以下但是在解除弹出窗口后它们都没有加载,因此View永远不会被设置为禁用:
override func viewDidAppear(_ animated: Bool) {
dimView.isHidden = true
}
override func viewWillAppear(_ animated: Bool) {
dimView.isHidden = true
}
修改
这是我用来呈现popover的代码:
let popover = storyboard?.instantiateViewController(withIdentifier: "PopoverVC")
popover?.modalPresentationStyle = .popover
popover?.popoverPresentationController?.delegate = self as? UIPopoverPresentationControllerDelegate
popover?.popoverPresentationController?.sourceView = self.view
popover?.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
popover?.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
dimView.isHidden = false
self.present(popover!, animated: false)
答案 0 :(得分:0)
我意识到,dimView不在PopoverVC中,将其添加到PopoverVC中并在点击它时处理dismiss。在弹出窗口被解除后,viewDidAppear和viewWillAppear将不会被调用。所以你的屏幕仍然模糊。如果你将dimView添加到Popover,希望你能解决这些问题
答案 1 :(得分:0)
我认为您可以使用UIPopoverPresentationControllerDelegate和协议/委托解决您的两个问题,以便在您解除并隐藏dimView时告诉呈现的viewcontroller。
第一个问题可以这样实现:
extension YourViewController: UIPopoverPresentationControllerDelegate {
func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
return false
}
对于第二个问题,您可以通过委派传递函数。希望这个链接有助于此。
https://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/
干杯