从 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 的顶部布局指南(导航栏底部)的主要内容,如果未能解决你的问题,请参考以下文章