iOS 7 自定义容器控制器 - 如何设置子控制器的视图插图?

Posted

技术标签:

【中文标题】iOS 7 自定义容器控制器 - 如何设置子控制器的视图插图?【英文标题】:iOS 7 Custom Container Controller - How to set Child Controller's view insets? 【发布时间】:2014-09-20 00:22:55 【问题描述】:

我目前正在开发自定义容器控制器。问题是:我怎样才能正确地为我的后代孩子的滚动视图设置内容插图? 让我们举个例子。我正在制作一个底部有半透明视图的自定义容器控制器(CCC)(如 TabBar),我的容器控制器的子控制器是一个导航控制器(NC),它有一个表视图控制器(TVC)作为孩子。所以层次结构非常简单:

[CCC]
  ↑
[NC]
  ↑
[TVC]

现在 UINavigationController 和 UITabBarController 已经这样做了:它们设置 TVC contentInset 以使它们在 NavBar(或 TabBar)下滚动。但是我怎样才能达到同样的行为呢? 我希望我的 TVC(或其他)对其层次结构 100% 不可知,因此我不能让 TVC“手动”设置其内容插图。

我实施的第一个解决方案是将 - (void)viewWillLayoutSubviews 实施到 CCC 中,并在层次结构中导航以查找叶控制器签入(如果其视图是 ScrollView)。它工作正常,直到我在 NC 中推送另一个 TableViewController (TVC2)。这样做不会调用 viewWillLayoutSubviews,并且 CCC 无法知道它的子 TVC2。

UINavigationController 和 UITabBarController 内部采用的策略是什么?或者我怎样才能让它发挥作用?

【问题讨论】:

【参考方案1】:

我认为更改您自己的视图控制器的顶部和底部布局指南应该可以使其按预期工作。问题是,设置布局指南。作为“秘密”,布局指南实际上在内部实现为高度为 0 的 UIView 对象。因此,从技术上讲,您可以更改这些视图的来源以满足您的需求。请记住在每个布局通道上正确设置它们。

【讨论】:

我尝试将- (id<UILayoutSupport>)bottomLayoutGuide 方法添加到我的自定义容器中,该方法返回一个自定义UIView 子类,该子类实现了UILayoutSupport。 length 方法返回 90.0f 但没有任何变化。我还注意到半透明条的bottomLayoutGuide 为零。所以我认为这不是正确的做法。 不返回不同的视图。相反,获取系统布局指南视图并修改其框架。 不工作,表格视图仍然隐藏在自定义“标签栏”下:UIView *bottomLayoutGuide = (UIView *)self.bottomLayoutGuide; CGRect frame = bottomLayoutGuide.frame; frame.size.height = 100; bottomLayoutGuide.frame = frame;

以上是关于iOS 7 自定义容器控制器 - 如何设置子控制器的视图插图?的主要内容,如果未能解决你的问题,请参考以下文章

呈现子视图控制器的自定义容器视图控制器子项

《iOS Human Interface Guidelines》——Container View Controller

iOS - 创建自定义过渡动画

如何使用 iOS 7 自定义转换在顶部呈现半模态视图控制器

如何在 swift 中从父视图访问容器视图子视图

如何让 UIKit 为我提供自定义转换的转换协调器?