在特定时间手动触发"自动调整滚动视图插入"



我有一个UINavigationController,包含一个UIViewController,它是两个UITableViewController控制器的父级。

当用户点击导航控制器UIToolbar中的分段控件时,当前子表控制器将换出新的子表控制器。这包括从父层次结构中删除旧控制器,并将其视图作为父视图控制器的子视图删除。

导航视图控制器首次呈现时显示的第一个视图控制器的contentInsetautomaticallyAdjustsScrollViewInsets正确配置,但是,当我将其拉出并从第二个表视图控制器插入视图时,它没有。

此外,如果我旋转设备(这会缩小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;
}

我已经对其进行了测试,并且通过快速隐藏导航栏或工具栏似乎没有视觉故障,因此此解决方案似乎是可以接受的。

最新更新