从 XIB 加载时不遵守约束

Posted

技术标签:

【中文标题】从 XIB 加载时不遵守约束【英文标题】:Constraints not respected when loading from XIB 【发布时间】:2016-06-28 16:02:22 【问题描述】:

所以,我有以下XIB

这个 XIB 在作为 tableviewcell 加载时看起来像这样

我已经决定不再需要 TableView,所以我将我的 XIB 类从 UITableViewCell 更改为 UIView。在 ViewController 中,我将此代码添加到 viewDidLoad()

var nView = MyChartView.instanceFromNib() as! MyChartView
self.view.addSubview(nView)

结果我得到了这个

如您所见,它忽略了边距并继续向右(忽略红色,因为我使用它来尝试调试问题。没有图表数据也不是问题)。我已经打印了 xib 的框架宽度,我发现它比屏幕尺寸大很多,但我无法修复它。任何人都可以找出问题所在?

【问题讨论】:

【参考方案1】:

当你以编程方式添加子视图时,你还应该在子视图和它的父视图之间添加约束

var nView = MyChartView.instanceFromNib() as! MyChartView
self.view.addSubview(nView)
nView.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[nView]|", options:  [], metrics: nil, views: ["nView": nView]))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[nView]|", options: [], metrics: nil, views: ["nView": nView]))

【讨论】:

【参考方案2】:

您没有限制MyChartView 实例的宽度,方法是在添加子视图时指定精确大小,或者以编程方式在MyChartView 实例及其父视图之间添加约束。如果不执行其中一项操作,视图的尺寸将匹配它们在 xib 中的任何内容。

【讨论】:

我尝试更改 MyChartView 实例的框架以匹配屏幕,但没有任何区别。我将尝试以编程方式添加约束。但是为什么在tableview中不会出现这个问题呢? 我建议确保MyChartViewtranslateResizingMaskToConstraintsfalse 并且您添加约束(不仅仅是设置frame)来规定它在其超级视图中的位置。 NRitH 可能是对的,虽然您的 NIB 本身可能有约束,但它本身和它的超级视图之间没有任何约束。如果您仍然遇到问题,则必须编辑您的问题以向我们展示您以编程方式添加的约束,然后使用视图调试器或 lldb 在运行时向我们展示约束。 我明白你们的意思,我已经接受了 Anil Varghese 的回答,因为他有一个例子。我仍然不明白为什么它在 tableview 中正常工作。它是否推断出 tableview 中的约束? @DiogoMartins - 表格视图将其单元格添加为子视图(您可以实例化单元格,但表格视图将其添加到视图层次结构中),因此它负责设置自身和细胞。但是,如果您自己添加视图,那么这个负担就落在了您的肩上。 @Rob,我明白你的意思,现在明白了。感谢您的帮助。

以上是关于从 XIB 加载时不遵守约束的主要内容,如果未能解决你的问题,请参考以下文章

从框架加载 .xib 文件

尝试加载 xib 文件时无法同时满足约束

从 xib 文件加载的自动调整视图大小

如何在 Swift 中使用宽度约束将 Xib 加载到 CollectionView?

无法同时满足约束 - 在添加子视图时

在 UIScrollView 中未正确加载 XIB