【问题标题】:UINavigationController as subview to MSMessagesAppViewControllerUINavigationController 作为 MSMessagesAppViewController 的子视图
【发布时间】:2016-12-10 20:21:29
【问题描述】:

我正在创建一个 iMessage 扩展程序,扩展的演示风格我想使用UINavigationController。我正在尝试使用以下函数将导航控制器添加为MSMessagesAppViewController 的子视图:

private func present(viewController: UIViewController) {
    viewController.view.frame = view.frame

    addChildViewController(viewController)
    viewController.didMove(toParentViewController: self)

    view.addSubview(viewController.view)
}

我期待导航控制器以传统方式显示,其导航栏从 iMessage 本身的顶部栏下方开始。请参阅下图了解我的预期结果:

但是,view.frame 似乎实际上延伸到 iMessage 顶部栏下方。因此,我的导航控制器的导航栏隐藏在 iMessage 的顶部栏下方。然而,滚动视图本身的内容视图被正确定位,无需进一步定制。实际效果请看下图:

显然,我可以将导航控制器的框架设置为在顶栏下方开始。但是,我正在寻找不太依赖硬编码位置的解决方案。如果这样做,滚动视图也不会在 iMessage 顶部栏下方继续以获得半透明效果。

理想情况下,导航栏将显示在 iMessage 顶部栏的正下方,就像默认情况下滚动视图一样。

有人知道解决办法吗?

【问题讨论】:

标签: ios swift uinavigationbar childviewcontroller imessage-extension


【解决方案1】:

经过一番深思熟虑,我找到了一个非常老套的解决方案。我仍在接受反馈和其他答案。

可以通过创建一个初步的layoutView 来实现上述目的,该初步layoutView 被限制为使用AutoLayout 的布局指南。然后,通过将UINavigationController 的框架设置为与布局视图的框架相匹配,它实际上只会占用可见区域。

您可以使用Storyboard 设置像我这样的视图,如下所示:

然后在您的容器视图控制器(在我的情况下为createStickerViewController)中,只要满足约束,只需将您的UINavigationController 的框架分配给您的布局视图的框架:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Update frame after constraints have been satisfied for layoutView
    pickAssetNavigationController.view.frame = layoutView.frame
}

结果是导航控制器只占据了实际可见区域,因此导航栏按预期放置在 iMessage 顶部栏的正下方(参见原始问题中的图 1)。

【讨论】:

  • 如果我不是通过故事板在编码中创建第二个呈现视图控制器,你能帮忙吗?!?
  • @guhan0 您应该能够通过代码重新创建具有相同约束的layoutView,就像我在 Storyboard 中所做的那样。这个我没试过,但应该没有区别。
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多