【问题标题】:New iOS 13 Modal Presentation: Presenting Controller Doesn't Move Down新的 iOS 13 模态演示:演示控制器不会向下移动
【发布时间】:2020-02-05 05:43:07
【问题描述】:

在 iOS 13 中以模态方式呈现 UIViewControllers 时,我有一个奇怪的行为。我在 iOS 13 中看到的新呈现样式如下所示:

呈现视图控制器出现在呈现视图控制器的后面。它也被向下移动以模仿“堆栈”

同时,当通过我的应用呈现视图控制器时,我不断得到这种效果:

呈现新视图控制器时呈现视图控制器根本不动

我使用这段代码来展示这个视图控制器:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

这是我的问题: 我想知道为什么会发生这种情况,以及是否有办法以正常的 iOS 13 样式呈现视图控制器(呈现视图控制器向后移动)。

提前致谢!

【问题讨论】:

  • 作为测试,尝试注释掉controller.modalTransitionStyle = .coverVertical 甚至controller.modalPresentationStyle = .pageSheet(如果此代码也在iPad 上运行,则需要演示样式)。
  • 我把它注释掉了,但它并没有改变任何东西:(

标签: ios swift user-interface uiviewcontroller ios13


【解决方案1】:

这应该是您需要设置的唯一属性

presentedViewController.modalPresentationStyle = .automatic

详细说明 https://developer.apple.com/videos/play/wwdc2019/224/

【讨论】:

  • 将其设置为自动似乎无法解决此问题
  • 前景视图控制器后面的视图控制器是我称之为“现在”的那个。 (你可以在控制器后面看到的那个)
  • 是根吗?你可以检查 window.rootViewController
【解决方案2】:

如果没有 UINavigationController ,我认为可以使用 vc.modalPresentationStyle = .fullScreen 解决问题,否则可以使用以下代码:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

因为在 iOS 13 中这是一项新功能,Apple 已将视图控制器的默认呈现样式从 iOS 12 中的全屏更改为模式表单

【讨论】:

  • .fullScreen 使它看起来像旧的 iOS 12 演示文稿,您根本看不到它背后的控制器。这不是我想要的。
  • @CentrumGuy,你可以看到链接“medium.com/better-programming/…”,已经详细解释了。
  • 我知道 Apple 更改了 iOS 13 中的默认演示样式。但是,当我在我的应用程序中呈现我的视图控制器时,呈现控制器不会像 iOS 13 上的其他任何地方一样移动。你可以看看在第一张和第二张图片之间的差异,呈现视图控制器显示在最上面的视图控制器后面。我想让我的像第一张图片一样显示
  • 很高兴能帮上忙!
【解决方案3】:

原来问题出在我的视图控制器层次结构上。我可以通过将呈现视图控制器作为我的应用程序的根视图控制器来修复它。首先,我通过调用将后台控制器设置为根视图控制器

window.rootViewController = self

然后使用我之前的代码

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

我展示了视图控制器。感谢所有试图提供帮助的人!

【讨论】:

  • 我也有同样的问题。你在哪里设置了 rootViewController 标志?就在转场之前?
  • 我在展示“后台控制器”时设置了它。让我们称它们为控制器 1、2 和 3 以使事情更容易(1 位于最后面,2 位于 3 后面的背景中,3 位于前面,也就是教程控制器)。我们目前正在查看控制器 1。我没有在控制器 1 上调用 present() 来呈现控制器 2,而是将控制器 2 设置为根视图控制器。这基本上摆脱了控制器 1,我们的窗口现在在其层次结构中只有控制器 2。现在,您可以通过在控制器 2 上调用 present() 来正常显示控制器 3。
  • 当然,这对我有用,但会导致各种不同的问题,例如在 segue 期间消失状态栏或动画剪切,我也不认为它是安全的。必须有更好的解决方案...
  • 这些问题是什么时候出现的?当您调用 present() 或设置根视图控制器时?状态栏消失可能是因为状态栏是黑色文本,并且在出现 present() 时出现在黑色背景上,导致它与应用程序的背景融为一体。
  • 我创建了一个简单的演示项目。你可以在这里查看它:github。所有的逻辑都在 Controller1.swift 中。让我知道这是否有帮助!
【解决方案4】:

我们可以在检查器工具栏中更改它。要实现它:转到 Inspector Tollbar 的第五部分,然后将 Presentation 字段更改为 Full Screen。

【讨论】:

    【解决方案5】:

    以编程方式:

    let vc = UIViewController()
    vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
    self.present(vc, animated: true, completion: nil)
    

    来自故事板:

    就是这样。根本不需要玩根控制器或窗口。

    如需参考,请访问this article

    【讨论】:

      【解决方案6】:

      iOS13:假设您有 3 个视图控制器:FirstVC、SecondVC、ThirdVC

      FirstVC 为 SecondVC 提供以下代码:

      let secondVC = SecondVC()
      secondVC.modalPresentationStyle = .fullScreen
      firstVC.present(secondVC, animated: true, completion: nil)
      

      SecondVC 为 ThirdVC 提供以下代码:

      let thirdVC = ThirdVC()
      secondVC.present(thirdVC, animated: true, completion: nil)
      

      将 secondVC 的 modalPresentationStyle 更改为 .currentContext 即可解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多