【问题标题】:How to change the size of a popover如何更改弹出框的大小
【发布时间】:2016-09-17 00:54:18
【问题描述】:

我无法更改弹出框演示文稿的大小。这是我到目前为止所拥有的

 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' 是不可变的”

【问题讨论】:

  • 为什么不以模态表单的形式呈现,而不是尝试以非预期的方式使用弹出框?
  • 对不起,我没有指定。这将适用于 iPhone。根据苹果的说法,你不能在 iPhone 上调整模态表单的大小,但你可以在 iPad 上调整。除非我读错了。另外,我尝试了几种不同的方法来重新调整弹出框的大小,但似乎没有任何效果。我确信我提供的代码有一个简单的修复方法。我只是还没找到。

标签: ios swift popover


【解决方案1】:

在呈现的视图控制器上设置首选内容大小,而不是 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)

        }
    }

【讨论】:

    【解决方案2】:

    我通过情节提要修复了它: 点击你的控制器 单击属性检查器 视图控制器> 选中使用首选显式大小和输入值。

    【讨论】:

    • 虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    【解决方案3】:

    使用自动布局

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        与上面谢耶山的回答类似,我通过情节提要进行了设置。
        除了“Presentation”也必须是“Form Sheet”。

        【讨论】:

          【解决方案6】:

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

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

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

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

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

          如果你使用当前视图控制器的 viewWillDisappear 来改变 popover 的preferredContentSize,popover 会在视图控制器被弹出之后调整大小。这意味着动画有延迟。

          您必须在执行 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 必须在推送和弹出视图控制器之前更改。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-27
            • 2021-04-08
            相关资源
            最近更新 更多