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

Posted

技术标签:

【中文标题】Pager View Controller 的根视图的大小与后续 View Controller 的大小不同【英文标题】:Pager View Controller's root view's got different size than subsequent View Controller's 【发布时间】:2015-04-28 05:30:09 【问题描述】:

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

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

基本上我添加了两次,从情节提要,一个 ViewController 到 DMPagerViewController 并将其设置为 UINavigationControllerrootViewController,他是窗口的 rootViewController

视图控制器包含一个UIButton,用于推送同一 ViewController 的另一个实例,以及一个设置为viewWillAppear(_:) 的标签,该标签显示view.frame.size.height

我正在苦苦挣扎的是,显示的第一个视图的高度与推送的后续视图不匹配。

谁能告诉我为什么?

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

应用代表的 application:didFinishLaunchingWithOptions

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

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

window?.rootViewController = navController

【问题讨论】:

那么,你想匹配所有视图的框架高度吗? 我真正想要的是视图看起来相同,而不是使用半透明的 UINavigationBar 嵌入式UINavigationController。 “根视图控制器”与视图控制器的关系。它对你有用,我认为你的问题已经解决了 对不起,我想我没听懂。你是在建议我不要使用 pagerController 吗? 点击ViewController,然后点击Menu=>Editor=>Embed In=> Navigation Controller [1]:i.stack.imgur.com/uZM6x.png 【参考方案1】:

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

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

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

解释

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

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

    [self adjustControllerLayout];
    [self adjustPagerNavigationBarOnScroll];

您可以找到更多信息here

希望对你有帮助

【讨论】:

【参考方案2】:

这是因为导航栏。

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

如果你在 Xcode 中使用 Debug View Hierarchy 模式,你会看到它没有完全显示在屏幕上。

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

【讨论】:

navController.navigationBar.translucent = true 你的意思是? 我们走在正确的轨道上。但即使进行了修改,为什么按钮在屏幕上的位置不同? 如果你向上滚动视图,你会看到你可以让它与被推的位置相同。似乎 DMPagerViewController 不能与 UINavigationController 配合使用。

以上是关于Pager View Controller 的根视图的大小与后续 View Controller 的大小不同的主要内容,如果未能解决你的问题,请参考以下文章

片段无法加载到 View_pager tabLayout [重复]

如何在没有导航栏的 View Controller 内使用 Nav 推送 UIViewController

如何在 View Pager 中使用滑动抽屉?

无法更新 View Pager 中的中间片段。

如何创建带有点指示器的 Android View Pager?

隐藏在标签栏后面的 View Pager 的片段