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

Make view loaded from nib respect superview's top layout guide (Navigation Bar Bottom)

我有一个 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 控制器中的某个地方。

尝试以下方法之一:

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

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

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

从本质上讲,最后两个选项在相同的约束下做同样的事情,唯一不同的是 when/where 你添加了这个约束。如果您在整个应用程序的多个位置使用 LocationPermissionsInfoView,最好使用最后一个选项。

您是否尝试过在 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