我无法更改popover演示文稿的大小。这是我到目前为止所拥有的
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
if segue.identifier == "popoverView"
{
let vc = segue.destinationViewController
let controller = vc.popoverPresentationController
if controller != nil
{
controller?.delegate = self
controller?.sourceView = self.view
controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}
}
}
到目前为止,所有这一切都是以弹出窗口为中心并移除箭头,这很好。但它并没有调整容器的大小。任何帮助将不胜感激。谢谢。
当我使用preferredContentSize时,我收到错误"无法分配给属性:' preferredContentSize'是不可变的"
答案 0 :(得分:49)
在显示的视图控制器上设置首选内容大小而不是param.put("xxx", "123");
popoverPresentationController
答案 1 :(得分:17)
我通过故事板修复了它: 单击您的控制器 单击“属性”检查器 的ViewController> 选中“使用首选显式大小”和“输入值”。 Check Image
答案 2 :(得分:5)
使用自动版式
值得一提的是,您可以使用布局约束,而不是将preferredContentSize设置为特定值。为此,
将此添加到您的视图控制器:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.preferredContentSize = self.view.systemLayoutSizeFitting(
UIView.layoutFittingCompressedSize
)
}
确保从弹出窗口视图到控制器的根视图具有约束。这些可以是低优先级,空间> = 0约束。
答案 3 :(得分:1)
我没有使用故事板。我只是在popover中提出了一个UINavigationController:
self.present(popoverNavigationController!, animated: true) {}
在推送新视图控制器时调整popover大小的方法,只需在推送之前更改preferredContentSize即可。例如:
let newViewController = NewViewController()
popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400)
popoverNavigationController!.pushViewController(newViewController, animated: true)
问题是当我们弹出视图控制器时我们尝试调整popover的大小。
如果使用当前视图控制器的viewWillDisappear来更改弹出窗口的preferredContentSize,弹出窗口将调整大小,但弹出视图控制器后。这意味着动画有延迟。
您必须在执行popViewController之前更改preferredContentSize。这意味着你必须在导航栏中创建一个自定义后退按钮,如here所述。这是为Swift 4更新的实现:
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
按下新的“后退”按钮时运行下一个代码:
@objc func backButtonTapped(sender: UIBarButtonItem) {
self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200)
self.navigationController?.popViewController(animated: true)
}
基本上,必须在推送和弹出视图控制器之前更改preferredContentSize。
答案 4 :(得分:1)
答案 5 :(得分:0)
以上关于使用preferredContentSize
的答案是正确的,但是最重要的是实现协议UIPopoverPresentationControllerDelegate
并实现以下方法,否则将不会按预期方式更改内容大小。 / p>
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}