Pager View Controller 的根视图的大小与后续 View Controller 的大小不同

Pager View Controller's root view's got different size than subsequent View Controller's

我正在使用 DMPagerViewController,但我尝试使用其他的,它们似乎都有相似的行为。

我设置了一个 git 来尝试了解发生了什么:https://github.com/LucasCoelho/DMPager-Example

基本上我从情节提要中添加了两次 ViewController 到 DMPagerViewController 并将其设置为 UINavigationControllerrootViewController 谁是 window的rootViewController

视图控制器包含一个 UIButton 推送相同 ViewController 的另一个实例和一个设置在 viewWillAppear(_:) 的标签显示 view.frame.size.height

我遇到的问题是显示的第一个视图的高度与推送的后续视图不匹配。

谁能告诉我为什么?

如果你不想在 github 上下载它,这里有一些代码:

App Delegate 的 application:didFinishLaunchingWithOptions

pagerController = DMPagerViewController(viewControllers:[firstViewController, secondViewController])

let navController = UINavigationController(rootViewController: pagerController)
navController.navigationBar.translucent = false

window?.rootViewController = navController

是因为导航栏。

DMPagerViewController 有自己的自定义导航栏,所以它似乎没有考虑 UINavigationController.

的导航栏

如果您在 Xcode 中使用 Debug View Hierarchy 模式,您会发现该视图并未完全显示在屏幕上。

如果您设置 navController.navigationBar.translucent = true,您会看到您的标签将始终报告相同的尺寸。

你有这个错误是因为 DMPagerViewController 的子视图不适合父视图,因为没有约束也没有自动调整掩码来更新它们,这就是为什么这个错误只出现在 DMPagerViewController 而不是 ViewController。 所以要解决这个问题,只需在 DMPagerViewController 的初始化程序中取消注释这一行:

//   _scrollView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);

现在修复了bug,但是scrollView的内容高度大于视图高度。

解释

只有在调用这个方法的时候才获取到view的真实frame viewDidLayoutSubviews,因为之前计算了scrollView的content size,所以得到的值是错误的。要解决这个问题,我们应该在 viewDidLayoutSubviewsviewDidAppear 中添加一些代码(这两个方法在自动布局完成时调用。),我更喜欢 viewDidAppear 因为 viewDidLayoutSubviews 被称为多个次。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self adjustControllerLayout];
    [self adjustPagerNavigationBarOnScroll];
}

您可以找到更多信息here

希望对你有帮助