我正在创建一个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顶部栏的正下方,就像默认情况下滚动视图一样。
有没有人知道这方面的解决方案?
答案 0 :(得分:1)
经过一番商议后,我找到了一个非常讨厌的解决方案。我仍然接受反馈和其他答案。
可以通过创建初步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)。