从 nib 加载视图尊重 superview 的顶部布局指南(导航栏底部)

Posted

技术标签:

【中文标题】从 nib 加载视图尊重 superview 的顶部布局指南(导航栏底部)【英文标题】:Make view loaded from nib respect superview's top layout guide (Navigation Bar Bottom) 【发布时间】:2015-01-27 15:48:48 【问题描述】:

我有一个 UIViewController 和一个自定义 UINavigationBar(继承自它的超类)。

在这个控制器中,我正在实例化另一个 UIViewController 并将它的视图添加为我的视图中的子视图,如下所示:

// I believe this should be 'as LocationPermissionsInfoViewController' but it crashed badly that way. Any ideas?
var permissionsView = UIViewController(nibName:"LocationPermissionsInfoView", bundle: nil) as UIViewController

    self.view.addSubview(permissionsView.view)
    permissionsView.view.frame = self.view.bounds

LocationPermissionsInfoView 是在 IB 中设计的,具有各种自动布局约束。但是,我希望该视图中存在一个“contentView”,以尊重它作为子视图添加的视图的顶部布局指南(准确地说是自定义导航栏的底部)。现在,IB 显然只允许我在界面中设置与***视图相关的约束。

关于如何实现这一目标的任何想法?理想情况下来自 IB 或 LocationPermissionsInfoView 控制器中的某个地方。

【问题讨论】:

【参考方案1】:

尝试以下方法之一:

在您的视图中使用self.edgesForExtendedLayout = UIRectEdgeNone; 控制器的 -viewDidLoad 方法。这会将 origin.y 转换为 导航栏的底部。

在视图控制器中添加一个约束,使 LocationPermissionsInfoView 的视图尊重它的 topLayoutGuide。 由于您是以编程方式添加视图,因此约束 也需要以编程方式添加。

在 LocationPermissionsInfoView 中添加一个约束,强制它 遵守它的superview的topLayoutGuide。同样,这将是 在代码中(可能在-didMoveToSuperView 方法中)。确保 将此约束分配给 LocationPermissionsInfoView 的 view.superview 否则你会得到关于视图层次结构的错误。

本质上,最后两个选项在相同的约束下几乎做同样的事情,只是在添加此约束的时间/位置不同。如果您在整个应用程序中的多个位置使用 LocationPermissionsInfoView,最好使用最后一个选项。

【讨论】:

谢谢哥们。如果它解决了我的问题,我会进行调查并回来接受答案。 这也适用于从情节提要加载的视图。 谢谢,第一个对我有用,即使现在是:self.edgesForExtendedLayout = UIRectEdge.None【参考方案2】:

您是否尝试过在 IB 中添加另一个*** UIView?这样,您的所有 XIB 约束都与该视图相关。因此,当您将该子视图添加到主 VC 并设置边界时,它应该尊重您的约束。

var permissionsView : LocationPermissionsInfoView = UIViewController(nibName:"LocationPermissionsInfoView", bundle: nil) as UIViewController

self.view.addSubview(permissionsView.viewMainContent)
permissionsView.viewMainContent.frame = self.view.bounds

【讨论】:

viewMainContent 是什么? 这是一个新的 UIView,我建议您将其添加为 XIB 中的***视图。您的所有控件都应该进入那里并对其进行约束。听起来问题是因为您正在更改父视图,所以您正在失去所有约束。这种方法将允许您保留所有较低级别的约束,并且由于您正在为父视图设置框架,它应该都能按预期工作

以上是关于从 nib 加载视图尊重 superview 的顶部布局指南(导航栏底部)的主要内容,如果未能解决你的问题,请参考以下文章

在 Superview 中更改子视图的框架

从 Nib 加载视图不会初始化插座 - Monotouch

ios - 从 nib 文件加载解耦视图

从 nib 文件加载 UIView?

iOS 从 nib 加载视图会造成内存泄漏?

在 iOS Superviews 中强制布局位置和大小