如何更改弹出窗口的大小

How to change the size of a 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 时出现错误 "Cannot assign to property: 'preferredContentSize' is immutable"

在显示的视图控制器上设置首选内容大小,而不是 popoverPresentationController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
    {
        if segue.identifier == "popoverView"
        {
            let vc = segue.destinationViewController

            vc.preferredContentSize = CGSize(width: 200, height: 300)

            let controller = vc.popoverPresentationController

            controller?.delegate = self
            //you could set the following in your storyboard
            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)

        }
    }

我通过故事板修复了它: 点击你的控制器 单击属性检查器 ViewController> 选中使用首选显式大小和输入值。

我没有使用故事板。我只是在弹出窗口中显示一个 UINavigationController:

    self.present(popoverNavigationController!, animated: true) {}

推送新视图控制器时调整弹出窗口大小的方法,就是在推送之前更改preferredContentSize。例如:

    let newViewController = NewViewController()
    popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400)
    popoverNavigationController!.pushViewController(newViewController, animated: true)

问题是当我们弹出视图控制器时尝试调整弹出窗口的大小。

如果您使用当前视图控制器的 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。

以上关于使用 preferredContentSize 的回答是正确的,但最重要的是实施协议 UIPopoverPresentationControllerDelegate 并实施以下方法,否则它不会按预期更改内容大小.

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.none
}

与上面谢雪山的回答类似,我是通过故事板设置的。
除了 "Presentation" 还需要 "Form Sheet"。

使用自动布局

可能值得一提的是,您可以使用布局约束而不是将 preferredContentSize 设置为特定值。为此,

  1. 将此添加到您的视图控制器:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.preferredContentSize = self.view.systemLayoutSizeFitting(
            UIView.layoutFittingCompressedSize
        )
    }
    
  2. 确保从弹出视图到控制器的根视图都有约束。这些可以是低优先级,space >= 0 约束。