如何将子视图(如标签)添加到已有子视图的UIViewController主视图中?

时间:2016-03-08 23:00:43

标签: swift uiviewcontroller ios9

我正在使用一个框架来创建带有特定控件的UIViewControllers。我无法访问其故事板以手动修改它。有没有办法在视图中添加类似标签的东西并正确定位它,即使视图已经配置了自动布局?

现有的UIViewController有一个带有标签,文本字段和屏幕底部按钮的视图。我想在文本字段下面添加另一个标签。我该怎么做呢?

我尝试使用:

view.insertSubview(label, belowSubview: textField)

但标签最终位于左上角,并且它不属于视图的自动布局(即当我更改屏幕尺寸时,现有控件做正确的事情,只有我的标签获得丢失)。

3 个答案:

答案 0 :(得分:0)

标签似乎没有正确定位,因为它没有任何约束。

您可以尝试以下代码吗?

    label.translatesAutoresizingMaskIntoConstraints = false
    let topConstraint = NSLayoutConstraint(item: label, attribute: .Top, relatedBy: .Equal, toItem: textField, attribute: .Top, multiplier: 1.0, constant: 0.0)
    let leftConstraint = NSLayoutConstraint(item: label, attribute: .Left, relatedBy: .Equal, toItem: textField, attribute: .Left, multiplier: 1.0, constant: 0.0)
    let bottomConstraint = NSLayoutConstraint(item: label, attribute: .Bottom, relatedBy: .Equal, toItem: textField, attribute: .Bottom, multiplier: 1.0, constant: 0.0)
    let rightConstraint = NSLayoutConstraint(item: label, attribute: .Right, relatedBy: .Equal, toItem: textField, attribute: .Right, multiplier: 1.0, constant: 0.0)
    self.view.insertSubview(label, belowSubview: textField)
    NSLayoutConstraint.activateConstraints([topConstraint, leftConstraint, bottomConstraint, rightConstraint])

答案 1 :(得分:0)

没有什么可以阻止您添加新视图以查看层次结构,并使用AutoLayout将其位置与其中一个现有视图绑定。您当然必须能够访问现有视图。

我们可以假设原始视图层次结构不受限制,因此您不必过于担心视图混乱。

你基本上需要约束

  1. 尺寸非常简单,因为约束仅适用于该视图,然后
  2. 视图的位置,它与您从现有视图层次结构中选择的任何视图相关。

答案 2 :(得分:0)

below中的insertSubview(belowSubview:)指的是z定位,而不是y定位作为您的假设。由于您未对标签进行任何定位,因此默认为0,0。听起来你正在使用自动布局,所以你需要给出适当的约束:

view.addSubview(label)
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Top, relatedBy: .Equal, toItem: textView, attribute: .Bottom, multiplier: 1.0, constant: 8.0))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Left, relatedBy: .Equal, toItem: textView, attribute: .Left, multiplier: 1.0, constant: 0.0))
view.addConstraint(NSLayoutConstraint(item: label, attribute: .Right, relatedBy: .Equal, toItem: textView, attribute: .Right, multiplier: 1.0, constant: 0.0))