Uitableview 在特定时间手动触发“automaticallyAdjustsScrollViewInsets”

Uitableview 在特定时间手动触发“automaticallyAdjustsScrollViewInsets”,uitableview,uiviewcontroller,uiscrollview,uinavigationcontroller,uikit,Uitableview,Uiviewcontroller,Uiscrollview,Uinavigationcontroller,Uikit,我有一个UINavigationController,其中包含一个UIViewController,它是两个UITableViewController控制器的父级 当用户点击导航控制器的UIToolbar中的分段控件时,当前子表控制器将与新的子表控制器交换。这包括从父层次结构中删除旧控制器以及将其视图作为父视图控制器的子视图删除 当导航视图控制器首次显示它时显示的第一个视图控制器的contentInset由automaticallyadjustsscrollviewsinsets正确配置,但是,

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

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

当导航视图控制器首次显示它时显示的第一个视图控制器的
contentInset
automaticallyadjustsscrollviewsinsets
正确配置,但是,当我从第二个表视图控制器中拉出该视图并插入视图时,它没有正确配置

此外,如果我旋转设备(缩小
UINavigationBar
),然后切换回第一个视图控制器,则其
contentInset
现在不正确,不能正确滚动。但是,由于设备旋转,第二个控制器的
contentInset
属性设置正确


有没有一种方法可以在我需要时手动强制一个
UIViewController
重新执行其
自动调整滚动视图插入操作?

这不是一个绝对令人惊奇的方法,但我找到了一个有效的解决方案

插入新的子视图控制器不足以触发
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;
}
我已经对它进行了测试,通过快速隐藏导航栏或工具栏,似乎没有任何视觉故障,所以这个解决方案似乎是可以接受的