使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)

Posted

技术标签:

【中文标题】使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)【英文标题】:Adding UILabel to ScrollView Programmatically with AutoLayout (swift) 【发布时间】:2015-02-04 17:58:36 【问题描述】:

我有一个滚动视图,里面有一个故事板中的图像视图。我有这个代码所在的文件的 iboutlets 以及对这些视图的引用。它们分别称为scrollViewgraph。我正在尝试以编程方式在滚动视图内的图形下方添加很多 UILabel,但我什至无法显示。

我添加的宽度约束不会导致任何问题,但其他三个约束会出现运行时错误,即 The view hierarchy is not prepared for the constraint。我想将标签的顶部限制在图表的底部,将标签的左侧限制在滚动视图的左侧,将标签的底部限制在滚动视图的底部。我做错了什么?

更新代码:

  var noteBodyLabel = UILabel()
  noteBodyLabel.text = "test asdf  asd fasdf a sdf asdf as dfa sdf  safd"

  noteBodyLabel.setTranslatesAutoresizingMaskIntoConstraints(false)



  var widthCons = NSLayoutConstraint(
     item: noteBodyLabel,
     attribute: .Width,
     relatedBy: .Equal,
     toItem: nil,
     attribute: .NotAnAttribute,
     multiplier: 1, constant: 280)


  let topCons = NSLayoutConstraint(
     item: noteBodyLabel,
     attribute: .Top,
     relatedBy: .Equal,
     toItem: graph,
     attribute: .Bottom,
     multiplier: 1, constant: 0);


  let bottomCons = NSLayoutConstraint(
     item: noteBodyLabel,
     attribute: .Bottom,
     relatedBy: .Equal,
     toItem: scrollView,
     attribute: .Bottom,
     multiplier: 1, constant: 0);

  let leftCons = NSLayoutConstraint(
     item: noteBodyLabel,
     attribute: .Left,
     relatedBy: .Equal,
     toItem: scrollView,
     attribute: .Left,
     multiplier: 1, constant: 0);

  scrollView.addSubview(noteBodyLabel)
  noteBodyLabel.addConstraints([topCons,leftCons,bottomCons,widthCons])

【问题讨论】:

错误是因为您在两个不在同一棵树中的视图之间创建约束。在添加约束之前调用scrollView.addSubview(noteBodyLabel) @AaronBrager 看看我更新的代码 - 它仍在发生 'not prepare for the constraint'意味着您的约束中的一个视图尚未添加到视图层次结构中。您确定所有视图都已添加为子视图吗? @ChrisTruman 我的意思是我知道图形是 scrollView 的有效子视图,我知道 scrollView 是 self.view 的有效子视图。 graph 和 scrollView 都是通过故事板添加的,我的代码在 viewDidLoad 中运行。会不会跟这有关系? 可能是viewDidLoad不是加约束的合适时机:***.com/a/19398589/150920 【参考方案1】:

我发现我必须将约束添加到 self.view,而不是 note1 或任何其他元素。

  var note1 = UILabel()
  note1.text = "test asdf  asd fasdf a sdf asdf as dfa sdf  safd"

  note1.setTranslatesAutoresizingMaskIntoConstraints(false)
  scrollView.addSubview(note1)

  var widthCons = NSLayoutConstraint(
     item: note1,
     attribute: .Width,
     relatedBy: .Equal,
     toItem: nil,
     attribute: .NotAnAttribute,
     multiplier: 1, constant: 280)


  let topCons = NSLayoutConstraint(
     item: note1,
     attribute: .Top,
     relatedBy: .Equal,
     toItem: graph,
     attribute: .Bottom,
     multiplier: 1, constant: 0);

  let bottomCons = NSLayoutConstraint(
     item: note1,
     attribute: .Bottom,
     relatedBy: .Equal,
     toItem: scrollView,
     attribute: .Bottom,
     multiplier: 1, constant: 0);

  let leftCons = NSLayoutConstraint(
     item: note1,
     attribute: .Left,
     relatedBy: .Equal,
     toItem: scrollView,
     attribute: .Left,
     multiplier: 1, constant: 0);

  self.view.addConstraints([topCons, bottomCons, leftCons, widthCons])

【讨论】:

以上是关于使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIScrollView 和 AutoLayout 以编程方式创建控制器无法正确调整视图大小

NSTextField 和 AutoLayout:自动增长高度 -> 以编程方式

如何以编程方式设置 UIScrollView 以使用 autoLayout 水平滚动

AutoLayout约束以适应矩形内的视图,保持一定的纵横比(以编程方式)

iOS 使用 Autolayout 以编程方式修复 UIScrollView 中子视图的位置

以编程方式设置 AutoLayout 大小类?