【问题标题】:Make view loaded from nib respect superview's top layout guide (Navigation Bar Bottom)从 nib 加载视图尊重 superview 的顶部布局指南(导航栏底部)
【发布时间】: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 控制器中的某个地方。

【问题讨论】:

    标签: ios swift interface-builder autolayout uinavigationbar


    【解决方案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 中的顶级视图。您的所有控件都应该进入那里并对其进行约束。听起来问题是因为您正在更改父视图,所以您正在失去所有约束。这种方法将允许您保留所有较低级别的约束,并且由于您正在为父视图设置框架,它应该都能按预期工作
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多