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

标签 ios swift interface-builder autolayout uinavigationbar

我有一个带有自定义 UINavigationBarUIViewController(继承自它的父类(super class))。

在这个 Controller 中,我正在实例化另一个 UIViewController 并将它的 View 作为 subview 添加到我的 View 中,如下所示:

// 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 中设计的,具有各种自动布局约束。但是,我想要一个存在于该 View 中的“contentView”,以尊重它作为 subview 添加的 View 的顶部布局指南(准确地说是自定义导航栏的底部)。现在,IB 显然只允许我在界面中设置与顶级 View 相关的约束。

关于如何实现此目标的任何想法?理想情况下来自 IB 或 LocationPermissionsInfoView Controller 中的某处。

最佳答案

尝试以下操作之一:

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

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

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

从本质上讲,最后两个选项使用相同的约束条件执行相同的操作,只是在添加此约束条件的时间/位置不同。如果您在整个应用程序的多个位置使用 LocationPermissionsInfoView,最好使用最后一个选项。

关于ios - 使从 nib 加载的 View 尊重 superview 的顶部布局指南(导航栏底部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174454/

相关文章:

ios - View 未覆盖全屏(Swift 程序化 Storyboard)

ios - 如何等待另一个值被分配来运行.onAppear?

objective-c - 是否可以使用 iCloud 获取 iOS 书签?

用于检索 Firebase 数据的 Swift 服务类

ios - Interface Builder 网点管理

xcode - 如何在Cocoa中实现DataView?

objective-c - 如何检测/处理弯曲区域的触摸事件?

ios - 在 Swift 中将 Int 转换为 Double

ios - 日期格式在 swift 中无法正常工作

SwiftUI - 基于设备的自定义 TabBar 高度