将子类化的 UIView 添加到具有自动布局约束的 Nib

2024-03-08

我正在尝试创建一个 UIView(A),其中包含 2 个自定义视图 (B)

视图 B 使用自动布局约束进行设置,并在 Interface Builder 中制作,包括约束。在viewController的Nib中添加A

乙 - UIImageView(前导 = 10,尾随 = 10,垂直对齐) - UITextField(前导 = 10,尾随 = 10,垂直对齐)

视图控制器 A(300x300,水平对齐,垂直对齐)

在 ViewController 中,我将 A 固定为 300x300 并且 B1 和 B2 的前导、尾随、顶部和底部固定为 0。(这应该使 B1 和 B2 为 300x150,如果我遗漏了什么,请原谅)

加载视图 B 时,我使用以下代码加载其笔尖:

override func awakeAfterUsingCoder(aDecoder: NSCoder!) -> AnyObject! {
    if self.subviews.count == 0 {
        let bundle = NSBundle(forClass: self.dynamicType)
        var view = bundle.loadNibNamed("B", owner: nil, options: nil)[0] as B
        view.setTranslatesAutoresizingMaskIntoConstraints(false)
        let constraints = self.constraints()
        self.removeConstraints(constraints)
        view.addConstraints(constraints)
        return view
    }
    return self
}

但是当我尝试运行它时,我收到以下警告,包括崩溃:

The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7f897ad1acc0 V:[TestProject.B:0x7f897af73840(300)]>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.

我还尝试将视图添加为视图 B 的属性,并使用以下代码将其添加到 B

NSBundle.mainBundle().loadNibNamed("B", owner: self, options: nil)
self.addSubview(self.viewOfB);

这样做的结果是视图被添加到 viewController,但它没有采用自己 Nib 中的任何自动布局约束。

现在我不知道如何将此视图添加到视图控制器的视图(包括约束)。我究竟做错了什么?有一个更好的方法吗?

PS:视图A曾经也是自定义的。

PPS:我使用 Swift 来做到这一点,但我确信 Objective-C 中的解决方案也可以工作。


首先,您收到的错误是因为

  • 您无法在视图之间交换或移动约束
  • 在添加新约束之前,视图必须已添加到层次结构中
  • 约束通常添加到保存视图(或共同祖先)的父视图上。

    (更多详情请参见自动布局指南 https://developer.apple.com/library/IOs/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html)

我建议让视图 A (CustomView : UIView) 从 nib 文件加载内容(B 视图)并将它们添加为子视图。

技巧是你需要在 a 中布局 B 视图内容视图这样你的 nib 文件中就只有一个根对象。

这样,当您将内容视图添加为视图 A 子视图时,所有约束都将转移(类似于 UITableViewCells 使用其 contentView 的方式)。

重要的提示:内容视图应该NOT属于 CustomView 类类型。如果你想拖动出口和动作只需声明文件的所有者CustomView 类的对象并将它们链接到那里。

您的最终视图层次结构应如下所示:

MainView (ViewController's view)
  View A
    Content View
      B1 View
      B2 View

这样,视图 A 就可以在 ViewController 的 Storyboard/xib 中配置其布局,并且 B 视图将使用与内容视图相关的 nib 文件中的约束。

因此,唯一需要确保的是内容视图始终与视图 A 具有相同的大小。

class CustomView: UIView
{
 @IBOutlet var _b1Label: UILabel!
 @IBOutlet var _b2Button: UIButton!

func loadContentView()
{
    let contentNib = UINib(nibName: "CustomView", bundle: nil)

    if let contentView = contentNib.instantiateWithOwner(self, options: nil).first as? UIView
    {
        self.addSubview(contentView)

        //  We could use autoresizing or manually setting some constraints here for the content view
        contentView.translatesAutoresizingMaskIntoConstraints = true
        contentView.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
        contentView.frame = self.bounds
    }
}

override init(frame: CGRect)
{
    super.init(frame: frame)

    loadContentView()
}

required init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);

    loadContentView()
}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将子类化的 UIView 添加到具有自动布局约束的 Nib 的相关文章

随机推荐

  • 使用 C++ 实现 Android 事件处理程序

    我有一个 Java 布局设计 目前正在通过 JNI 移植到 C 我实际上已经完成了这一点 但我目前对如何设置事件处理程序 例如 setOnClickListener 感到困惑 我已经经历过JNI规范 https docs oracle co
  • 快速解码 JPEG 图像的方法

    我需要解码 解压为位图 非常小的 大约 1200 1200 JPEG 问题是我需要尽快完成 我尝试过 libjpeg 但速度很慢 我也尝试过 BitmapFactory decodeByteArray 它有点快 但仍然不够快 还有什么其他选
  • 在哪里编辑 mysql 全文停用词列表?

    我看到mysql的全文停用词列表是英文的 考虑到 mysql 在全世界范围内使用 这有点奇怪 无论如何 我将 ft min word len 降低到 3 所以我需要将我的语言中的常用单词添加到此列表中 有人可以告诉我在哪里可以找到它吗 Th
  • Rails 3 日期时间比较与 ActiveRecord 查询中的日期

    我试图在模型中搜索等于特定日期的任何日期 同时忽略时间戳 在 Rails 中我可以简单地执行它DateTime to date somedate 但是我认为在 SQL 中制定起来并不那么容易 因为我无法将 to date 方法应用于整个列
  • S3 Lambda 在 10 分钟后触发双重调用

    我们遇到了由 S3 ObjectCreated Events 触发的 Lambda 的双重 Lambda 调用 那些双重调用发生exactly第一次调用后 10 分钟 不是第一次尝试完成后 10 分钟 而是第一次调用发生后 10 分钟 原始
  • 以随机顺序迭代数组[重复]

    这个问题在这里已经有答案了 给定一个序列N元素 比如std vector or T 是否有任何有效的方法可以按随机顺序迭代其元素 仅访问每个元素一次 该解决方案必须避免创建带有打乱索引的附加数组 EDIT 我们还需要能够跟踪原始索引 不是特
  • 将决策边界拟合到 R 中的逻辑回归模型

    我正在努力使用 ggplot 在 R 中绘制决策边界 我有两个变量 考试成绩 和一个学生是否被录取的二元分类 数据如下所示 gt head exam data Exam1Score Exam2Score Admitted 1 34 6236
  • addLoadEvent 无助于解决 onload 冲突

    我使用流行的 addLoadEvent 进行所有 JS 加载 如下所示 function addLoadEvent func var oldonload window onload if typeof window onload funct
  • 如何在 R kableextra 中将 kable 标题/标题居中,同时保持行左对齐

    我想让表格的标题 标题 居中 但列的值保留分配 我还希望我的标题被分成两行 并且每行都居中 align选项以相同的方式更改它们 head mtcars gt kbl caption first row second row align l
  • ggplot2 3.1.0 中的自定义 y 轴刻度和辅助 y 轴标签

    Edit 2 ggplot2 package 的当前开发版本确实解决了我在下面的问题中提到的错误 使用安装开发版本 devtools install github tidyverse ggplot2 Edit 这似乎是错误的行为sec ax
  • Rails、RVM、Apache、Passenger 错误 - SpawnManager 权限在 2.3.11 中被拒绝

    我使用 Passenger 时遇到以下错误 这似乎只有在使用 2 3 11 时才会出现问题 我怎样才能解决这个问题 Passenger ERROR ext common ApplicationPool SpawnManager h 220
  • 使用android和php进行套接字编程[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试创建一个使用套接字连接到
  • Yii:按 id ASC 选择最后 20 个条目

    我想获取表中最后 20 个条目 但按 ID 升序排序 在 Sql 中 这并不是很复杂 SELECT FROM SELECT FROM comments WHERE postID id ORDER BY id DESC LIMIT 20 t
  • 在节点中测试失败的请求

    我有一些代码如下所示 var request require request function Service this config require path to config json Service prototype doThin
  • MySQL 函数将工作日数添加到 DATETIME

    我需要一个 MySQL 函数 它允许我传递多个工作日 周一至周五 和开始日期或日期时间 对我的实现来说并不重要 并让它返回一个新的日期或日期时间多个工作日将来 例子 SELECT AddWorkDays 10 2013 09 01 假设 2
  • Angular IE9 文件上传不起作用

    我使用这种方式上传文件
  • 最好的 GRID 和 TREE 控件是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Angular 中重置 this.dataSource.filterPredicate

    我正在使用过滤器和选择mat table 为了使用 select 进行过滤 我在相关字段上使用过滤谓词 public applyFilter filterValue string this dataSource filterPredicat
  • 以 dplyr 为单位的滚动总和

    set seed 123 df lt data frame x sample 1 10 20 replace T id rep 1 2 each 10 对于每个id 我想创建一个列 其中包含前 5 个的总和x价值观 df gt group
  • 将子类化的 UIView 添加到具有自动布局约束的 Nib

    我正在尝试创建一个 UIView A 其中包含 2 个自定义视图 B 视图 B 使用自动布局约束进行设置 并在 Interface Builder 中制作 包括约束 在viewController的Nib中添加A 乙 UIImageView