使用自定义标签栏自动调整视图的内容插入

Posted

技术标签:

【中文标题】使用自定义标签栏自动调整视图的内容插入【英文标题】:Automatically adjust content insets for views with custom a tab bar 【发布时间】:2017-03-12 18:15:59 【问题描述】:

我创建了一个自定义标签栏控制器。它的工作方式与UITabBarController 非常相似,但UITabBar 的布局更高级。

如何调整自定义标签栏控制器中显示的视图的底部内容插入?例如,如果我在自定义标签栏控制器中显示UITableView,我可以像这样手动调整内容插图。

self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0);
self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 49, 0);

但是,如果我将另一个视图(如集合视图)推送到此表视图上,问题会变得更加复杂。有没有办法让这些视图像默认的UITabBarController 实现一样自动调整它们的内容插入?

【问题讨论】:

您是否继承了 uitabbarcontroller 的子类? 不,它是 UIViewController 的子类。 一种方法是检查父控制器,对于子控制器,如果视图存在,则提供 contentInsets 不知道它是否会起作用,但我会尝试在您的自定义标签栏控制器中覆盖 bottomLayoutGuide 我没有尝试过,但我对自动布局不是很熟悉。我该如何设置? 【参考方案1】:

我们最近在我们的应用程序中做了类似的事情,最终只是拥有一个容器视图,其中包含我们要在控制器中显示的任何内容。这种方法的优点是您可以向容器视图添加任何您想要的约束(例如容器和标签栏之间的底部填充)。

Container view with bottom padding to tab bar.

编辑:误解了问题

您可以简单地检查内容视图是否能够 setContentInset:

- (void)setContentInset:(UIEdgeInset)insets 

    if ([self.contentView respondsToSelector:@selector(setContentInset:)]) 
        [self.contentView setValue:insets forKey:@"contentInset"];
    

【讨论】:

直接设置内容插入的问题是,如果你将一个视图推送到这个导航控制器上,下一个视图不会采用这些内容插入。我不明白 UITabBarController 是如何自动执行此操作的。 应该还是挺直截了当的。子类导航控制器,覆盖pushViewController:,添加委托方法willPushViewController:,将标签栏控制器设置为导航控制器的委托,然后您的标签栏控制器只需要确定被推送的视图控制器是否能够设置内容插入的方法,如果是,设置它们。例如,您可以定义一个协议并确保您的 VC 在需要调整插图时遵守该协议。

以上是关于使用自定义标签栏自动调整视图的内容插入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中设置自定义视图的内在内容大小?

iOS 5 自定义标签栏取消分配表视图?

Django 博客开发教程 10 - 页面侧边栏:使用自定义模板标签

swift和xcode 6中的自定义标签栏

自定义标签栏问题

使用自动布局自定义集合视图单元格的动态高度