在子视图控制器中调整滚动视图的插入。

3

我有一个视图控制器层次结构,其中包含以下父子关系:

UINavigationController (contains) MainViewController (contains) UIPageViewController (contains) UITableViewController

在最内层的UITableViewController中,我将automaticallyAdjustScrollViewInset设置为YES,但这个设置似乎不起作用。如下面的截图所示,可以看到表视图的contentInset似乎没有随导航栏调整。

我的目标是使这个表视图的contentInset随着最外层的导航栏自动调整。如果导航栏或状态栏被隐藏,我希望内容插入相应地进行调整。

我该怎么做呢?谢谢!

enter image description here

2个回答

3
导航控制器会自动调整其子视图控制器的topLayoutGuide。在您的情况下,它没有被传递到足够低的层级。
如果您确保这个topLayoutGuide传递到您的表视图控制器,那么您就不必手动设置contentInset
此外,您的视图控制器层次结构似乎过于复杂(我不知道您项目的详细信息)。这个简化版本可以免费为您提供所需的功能。 enter image description here

我有相同的设置,但仍需要手动调整顶部插入。有什么指示吗? - Alexis
请检查包含容器视图的视图控制器是否设置了automaticallyAdjustScrollViewInset属性。 - Onato
2
事实证明,当 automaticallyAdjustScrollViewInset 为 true 时,只有视图控制器的第一个子视图会被探索以查找滚动视图。此外,它会在找到滚动视图后立即停止,因此如果您有多个容器,则仅对第一个容器起作用。在我的情况下,我在容器视图后面有一个图像视图,因此最后一个容器不会被探索以查找滚动视图,因此它不会适应顶部插入。唯一的解决方案是手动插入适应。 - Alexis

0

显然,最外层的UINavigationController仍然可以通过其navigationController属性被最内层的UITableViewController访问。

由于导航栏的框架可以被最内层的视图控制器访问,因此我们可以在其viewDidLayoutSubviews中执行以下操作。

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    self.tableView.contentInset = UIEdgeInsetsMake(CGRectGetMaxY(self.navigationController.navigationBar.frame), 0, 0, 0);
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接