UINavigationController作为MSMessagesAppViewController的子视图

时间:2016-12-10 20:21:30

标签: ios swift uinavigationbar childviewcontroller imessage-extension

我正在创建一个iMessage扩展,其中扩展的演示文稿样式我想使用UINavigationController。我正在尝试使用以下函数将导航控制器添加为MSMessagesAppViewController的子视图:

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

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

    view.addSubview(viewController.view)
}

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

Expected result

然而,似乎view.frame实际上扩展到了iMessage顶部栏的下方。因此,导航控制器的导航栏隐藏在iMessage顶部栏的下方。但是,滚动视图本身的内容视图无需进一步自定义即可正确定位。请参阅下图以了解实际结果:

Actual result

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

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

有没有人知道这方面的解决方案?

1 个答案:

答案 0 :(得分:1)

经过一番商议后,我找到了一个非常讨厌的解决方案。我仍然接受反馈和其他答案。

可以通过创建初步layoutView来实现上述目标,该约束使用AutoLayout约束到布局指南。然后,通过将UINavigationController的帧设置为与布局视图的帧匹配,它实际上仅占据可见区域。

您可以使用Storyboard设置类似我的视图,如下所示:

LayoutView layout

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

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

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