使从笔尖加载的视图尊重超级视图的顶部布局指南(导航栏底部)

Tha*_*nos 3 interface-builder uinavigationbar ios autolayout swift

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

关于如何实现这一目标有什么想法吗?理想情况下来自 IB 或LocationPermissionsInfoView控制器中的某个位置。

Num*_*riq 5

尝试以下方法之一:

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

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

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

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