从 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中不会出现这个问题呢? 我建议确保MyChartView
的translateResizingMaskToConstraints
是false
并且您添加约束(不仅仅是设置frame
)来规定它在其超级视图中的位置。 NRitH 可能是对的,虽然您的 NIB 本身可能有约束,但它本身和它的超级视图之间没有任何约束。如果您仍然遇到问题,则必须编辑您的问题以向我们展示您以编程方式添加的约束,然后使用视图调试器或 lldb 在运行时向我们展示约束。
我明白你们的意思,我已经接受了 Anil Varghese 的回答,因为他有一个例子。我仍然不明白为什么它在 tableview 中正常工作。它是否推断出 tableview 中的约束?
@DiogoMartins - 表格视图将其单元格添加为子视图(您可以实例化单元格,但表格视图将其添加到视图层次结构中),因此它负责设置自身和细胞。但是,如果您自己添加视图,那么这个负担就落在了您的肩上。
@Rob,我明白你的意思,现在明白了。感谢您的帮助。以上是关于从 XIB 加载时不遵守约束的主要内容,如果未能解决你的问题,请参考以下文章