我试图将一个显示UIViewController
为另一个弹出窗口。为此,我建立了以下...
func showPopover(ofViewController popoverViewController: UIViewController, sender: UIView) {
popoverViewController.modalPresentationStyle = .popover
popoverViewController.popoverPresentationController?.sourceView = sender
popoverViewController.popoverPresentationController?.sourceRect = sender.bounds
popoverViewController.popoverPresentationController?.delegate = self
self.present(popoverViewController, animated: true, completion: nil)
}
但是,新的 VC 在紧凑型设备上始终显示为全屏模式演示,而不是实际的弹出框。根据我在这里和这里阅读的内容,这是正常行为,但应该可以通过委托进行定制。
我已将呈现的 VC 声明为 implementation UIPopoverPresentationControllerDelegate
,将其设置为委托,并实现所需的方法;但是,委托方法永远不会被调用。这意味着无论如何,“弹出框”仍然以模态显示。
任何的建议都受欢迎。
其他一些标注:
- 如果在它之前添加了一个标记,
viewControllerForAdaptivePresentationStyle
它会被调用@objc
,但这对其他人不起作用。 - Xcode 对每一个都给出警告:Instance method ... 几乎符合协议 'UIAdaptivePresentationControllerDelegate' 的可选要求... 但是,方法签名是 100% 匹配的。不确定这是否是这个 bug的一个实例,有人说它仍然存在于 Xcode 10.1 中。
谢谢。
实现的委托功能:
func adaptivePresentationStyle(for: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.popover
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return UIModalPresentationStyle.popover
}
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
switch style {
case .fullScreen: // Configuration for full-screen
default: return controller.presentedViewController
}
}