我有一个UINavigationController
,包含一个UIViewController
,它是两个UITableViewController
控制器的父级。
当用户点击导航控制器UIToolbar
中的分段控件时,当前子表控制器将换出新的子表控制器。这包括从父层次结构中删除旧控制器,并将其视图作为父视图控制器的子视图删除。
导航视图控制器首次呈现时显示的第一个视图控制器的contentInset
由automaticallyAdjustsScrollViewInsets
正确配置,但是,当我将其拉出并从第二个表视图控制器插入视图时,它没有。
此外,如果我旋转设备(这会缩小UINavigationBar
),然后交换回第一个视图控制器,它的contentInset
现在不正确,并且无法正确滚动。但是,由于设备旋转,第二个控制器确实正确设置了其contentInset
属性。
有没有办法在需要时手动强制UIViewController
重做其automaticallyAdjustsScrollViewInsets
操作?
这不是一个绝对惊人的,但我找到了一个有效的解决方案。
插入新的子视图控制器不足以触发UINavigationController
自动计算出新子视图中任何滚动视图的适当contentInset
值。但!您可以通过执行无论如何都需要它的操作来强制它执行该计算。例如,隐藏和显示导航栏或工具栏。
- (void)insertViewController:(UIViewController *)viewController
{
// Add the view to our view
viewController.view.frame = self.view.bounds;
[self.view addSubview:viewController.view];
// Add the new controller as a child
[self addChildViewController:viewController];
[viewController didMoveToParentViewController:self];
// Show and hide the toolbar to force the content inset calculation
self.navigationController.toolbarHidden = YES;
self.navigationController.toolbarHidden = NO;
}
我已经对其进行了测试,并且通过快速隐藏导航栏或工具栏似乎没有视觉故障,因此此解决方案似乎是可以接受的。