使从 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
我有一个 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