【问题标题】:Constraints not respected when loading from XIB从 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 的框架宽度,我发现它比屏幕尺寸大很多,但我无法修复它。任何人都可以找出问题所在?

【问题讨论】:

    标签: ios swift uiview constraints 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,我明白你的意思,现在明白了。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      相关资源
      最近更新 更多