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
并将其设置为 UINavigationController
的 rootViewController
,他是窗口的 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的内容大小,所以得到了错误的值。为了解决这个问题,我们应该在viewDidLayoutSubviews
或viewDidAppear
中添加一些代码(这两个方法在自动布局完成时调用。),我更喜欢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