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
并将其设置为 UINavigationController
的 rootViewController
谁是 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,所以得到的值是错误的。要解决这个问题,我们应该在 viewDidLayoutSubviews
或 viewDidAppear
中添加一些代码(这两个方法在自动布局完成时调用。),我更喜欢 viewDidAppear
因为 viewDidLayoutSubviews
被称为多个次。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self adjustControllerLayout];
[self adjustPagerNavigationBarOnScroll];
}
您可以找到更多信息here
希望对你有帮助
我正在使用 DMPagerViewController
,但我尝试使用其他的,它们似乎都有相似的行为。
我设置了一个 git 来尝试了解发生了什么:https://github.com/LucasCoelho/DMPager-Example
基本上我从情节提要中添加了两次 ViewController 到 DMPagerViewController
并将其设置为 UINavigationController
的 rootViewController
谁是 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,所以得到的值是错误的。要解决这个问题,我们应该在 viewDidLayoutSubviews
或 viewDidAppear
中添加一些代码(这两个方法在自动布局完成时调用。),我更喜欢 viewDidAppear
因为 viewDidLayoutSubviews
被称为多个次。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self adjustControllerLayout];
[self adjustPagerNavigationBarOnScroll];
}
您可以找到更多信息here
希望对你有帮助