提问人:AMichael 提问时间:1/18/2020 更新时间:1/18/2020 访问量:971
显示不带 segue 的弹出框 -- 弹出框仍处于全屏状态
Presenting a popover without segue -- Popover is still full screen
问:
我有一个UIViewController,里面有一个按钮,是我以编程方式制作的(我们称之为MyViewController)。我试图在点击按钮时显示一个弹出窗口。我们将弹出框称为 DestinationViewController。点击该按钮时将调用以下函数:
func buttonAction(_ button: UIView) {
var popover = storyboard?.instantiateViewController(withIdentifier: "destinationVC") as? DestinationViewController
popover?.popoverPresentationController?.delegate = self
popover?.modalPresentationStyle = .popover
popover?.popoverPresentationController?.sourceView = button
//popover?.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: 50, height: 50)
popover?.preferredContentSize = CGSize(width: 200, height: 100)
present(popover!, animated: true, completion: nil)
}
(我注释掉了 sourceRect 行,因为它没有做任何事情,但我不知道我是否只是用错了。
此外,我确保 MyViewController 符合协议 UIPopoverPresentationControllerDelegate。因此,MyViewController 实现了以下函数:
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
最后,在 DestinationViewController 的故事板中,我选中了宽度为 200 和高度为 100 的“使用首选显式大小”框。
但是,我的 DestinationViewController 仍全屏显示。我读到adaptivePresentationStyle函数应该可以防止这种情况,但没有运气。我知道使用 segue 可以使它正常工作,但我无法在故事板中制作 segue,因为我的按钮是以编程方式制作的。
关于我应该做些什么来解决这个问题的任何想法?我对制作弹出窗口不太熟悉,所以我需要一些帮助。
答:
在访问该属性之前,您需要将 设置为:modalPresentationStyle
.popover
popoverPresentAtionController
从文档中:
如果创建了视图控制器,但尚未显示它,则当 modalPresentationStyle 属性中的值为 UIModalPresentationStyle.popover 时,访问此属性将创建一个弹出框表示控制器。如果模式表示样式是其他值,则此属性为 nil。
由于在设置委托之前尚未设置模式表示样式,因此不会创建弹出框表示控制器。当您设置 时,将创建弹出框控制器,因为现在的演示样式是,但不会在此实例上设置委托。.sourceView
.popover
此外,还可以将 segue 与在代码中创建的按钮一起使用,方法是在按钮操作处理程序代码中使用。performSegue
评论