如何更改弹出窗口的大小

时间:2016-05-19 22:35:48

标签: ios swift popover

我无法更改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'是不可变的"

6 个答案:

答案 0 :(得分:49)

在显示的视图控制器上设置首选内容大小而不是param.put("xxx", "123");

popoverPresentationController

答案 1 :(得分:17)

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

答案 2 :(得分:5)

使用自动版式

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

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.preferredContentSize = self.view.systemLayoutSizeFitting(
            UIView.layoutFittingCompressedSize
        )
    }
    
  2. 确保从弹出窗口视图到控制器的根视图具有约束。这些可以是低优先级,空间> = 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)

与谢山的上述答案类似,我通过情节提要设置了该内容。
除了“演示文稿”也必须是“表格”。

enter image description here

答案 5 :(得分:0)

以上关于使用preferredContentSize的答案是正确的,但是最重要的是实现协议UIPopoverPresentationControllerDelegate并实现以下方法,否则将不会按预期方式更改内容大小。 / p>

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