我终于能够在 NavController 中正确对齐嵌入式 UIPageViewController,它本身位于 TabBarcontroller 内。我通过在一个虚拟的“rootviewcontroller”中以编程方式创建 pageViewController 来做到这一点,遵循名为“基于页面的应用程序”的默认 Xcode“新项目”中给出的示例。
在我的情况下,以下情节提要布局产生错误:TabBarController -> NavController -> UIPageViewController (scroll-horizontal) -> ContentViewController
我将故事板布局更改为:TabBarController -> NavController -> CustomRootViewController
CustomRootViewController 实例化 UIPageViewController 并将其保存为成员属性。CustomRootViewController 成为其 PageViewController 的 DataSource 和 Delegate。按照名为“Page-based Application”的默认 Xcode“New Project”来获取如何设置 RootViewController 的示例。
不幸的是,当您使用拖放式“UIPageViewController”时,整个问题似乎是由 Storyboard 中的一个错误引起的,它具有滚动水平过渡类型,嵌入在 navController(和/或 tabbarcontroller)中。仅供参考 - 在 pageViewController 的 viewWillAppear 中,我尝试将 pageViewController 和 contentViewControllers 的框架分别重置为 (0,0),大小与设备匹配,但是 pageViewController 的初始 viewController 的视图总是会向下移动,看起来像是嵌入它的 tabbarcontroller 的高度。对于那些希望进一步研究这个问题的人,这里有一些观察:
在viewDidLoad中,可以设置pageViewController初始视图的Frame来抵消layout-error。但是你可能不得不为不同方向的不同设备处理不同的布局校正,这可能会让人头疼。
在 Storyboard 中,将 pageViewController 的过渡样式设置为“page curl”可以解决布局问题。因此,我确信布局问题存在于页面滚动中,它是在实例化时设置的。Storyboard 的实例化会产生布局错误,但在我的 CustomRootViewController 中以编程方式实例化是没有错误的。