【问题标题】:Presenting a popover without segue -- Popover is still full screen呈现一个没有 segue 的弹出框——弹出框仍然是全屏的
【发布时间】:2020-01-17 22:30:07
【问题描述】:

我有一个 UIViewController,里面有一个我以编程方式制作的按钮(我们就叫它 MyViewController)。我试图在点击按钮时显示一个弹出框。让我们调用弹出框 DestinationViewController。该按钮在点击时会调用以下函数:

func buttonAction(_ button: UIView) {
   var popover = storyboard?.instantiateViewController(withIdentifier: "destinationVC") as? DestinationViewController
   popover?.popoverPresentationController?.delegate = self
   popover?.modalPresentationStyle = .popover
   popover?.popoverPresentationController?.sourceView = button
   //popover?.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: 50, height: 50)
   popover?.preferredContentSize = CGSize(width: 200, height: 100)

   present(popover!, animated: true, completion: nil)         
}

(我注释掉了 sourceRect 行,因为它什么也没做,但我不知道我是不是用错了。)

另外,我确保 MyViewController 符合 UIPopoverPresentationControllerDelegate 协议。于是MyViewController实现了功能:

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

最后,在我的 DestinationViewController 故事板中,我选中了“使用首选显式大小”框,宽度为 200,高度为 100。

但是,我的 DestinationViewController 仍然全屏显示。我已经读到adaptivePresentationStyle 函数应该可以防止这种情况,但没有运气。我知道使用转场会使其正常工作,但我无法在情节提要中进行转场,因为我的按钮是通过编程方式制作的。

有什么想法可以解决这个问题吗?我对制作popovers不太熟悉,所以我需要一些帮助。

【问题讨论】:

    标签: ios swift popover uipopoverpresentationcontroller


    【解决方案1】:

    您需要在访问popoverPresentAtionController 属性之前将modalPresentationStyle 设置为.popover

    来自the documentation

    如果您创建了视图控制器但尚未呈现它,当 modalPresentationStyle 属性中的值为 UIModalPresentationStyle.popover 时,访问此属性会创建一个弹出框呈现控制器。如果模态表示样式是不同的值,则此属性为 nil。

    由于您在设置委托之前尚未设置模态演示样式,因此不会创建弹出式演示控制器。设置 .sourceView 时将创建弹出框控制器,因为演示样式现在为 .popover,但不会在此实例上设置委托。

    此外,您可以通过在按钮操作处理程序代码中使用 performSegue 来将转场与您在代码中创建的按钮一起使用。

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2011-07-04
      • 2014-05-25
      相关资源
      最近更新 更多