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

时间:2015-01-27 15:48:48

标签: ios swift interface-builder autolayout uinavigationbar

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

2 个答案:

答案 0 :(得分:4)

请尝试以下方法之一:

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

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

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

基本上,最后两个选项几乎使用相同的约束执行相同的操作,并且仅在添加此约束的时间/位置不同。如果您在应用程序中的多个位置使用LocationPermissionsInfoView,最好使用最后一个选项。

答案 1 :(得分:0)

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