1

我正在创建一个 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 顶部栏的正下方,就像默认情况下滚动视图一样。

有谁知道解决这个问题?

4

1 回答 1

1

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

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

Storyboard您可以使用如下方式设置像我这样的视图:

LayoutView 布局

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

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

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

于 2016-12-10T23:41:18.927 回答