1

我有一个UINavigationController,包含一个UIViewController,它是两个UITableViewController控制器的父代。在某个时间手动触发`automaticallyAdjustsScrollViewInsets`

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

导航视图控制器首次显示时显示的第一个视图控制器的contentInset正确配置为automaticallyAdjustsScrollViewInsets,但是,当我将其拉出并从第二个视图控制器插入视图时,则不会。此外,如果我旋转设备(其收缩UINavigationBar),然后交换回第一个视图控制器,其contentInset现在是不正确的,它不正确滚动。但是,第二个控制器的设备旋转会导致其属性设置正确。

有没有办法在我需要时手动强制UIViewController重做其automaticallyAdjustsScrollViewInsets操作?

回答

1

这不是一个绝对惊人的,但我找到了一个可行的解决方案。

插入新的子视图控制器不足以触发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; 
} 

我测试它,并且有出现通过快速隐藏任一导航栏或工具栏是没有视觉毛刺,所以这种解决办法似乎是可接受的。