Swift以编程方式添加约束

时间:2016-02-17 09:40:06

标签: ios iphone swift

我在故事板编辑器的UILabel中添加UIViewController(amountLabel)。然后在swift文件viewDidLoad中,我以编程方式创建UITextField(paymentTextField)并尝试在amountLabelpaymentTextField之间添加约束。这是viewDidload中的代码:

let paymentTextField = UITextField()
    paymentTextField.translatesAutoresizingMaskIntoConstraints = false
    paymentTextField.frame = CGRectMake(15, 100, CGRectGetWidth(self.view.frame) - 30, 44)
    self.view.addSubview(paymentTextField)

    let bottonConstraint = NSLayoutConstraint(item: paymentTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.amountLabel , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 30)
    bottonConstraint.identifier = "paymentTextFieldSpacing"
    NSLayoutConstraint.activateConstraints([bottonConstraint])

但是我收到了一个错误:

  

"由于未捕获的异常终止应用程序' NSGenericException',   原因:'无法使用项目激活约束>和>因为他们没有共同的祖先。   约束是否引用不同视图层次结构中的项目?   这是非法的。"

有谁知道出了什么问题? amountLabel直接拖到故事板中的视图和" paymentTextField"以编程方式添加到同一视图。为什么他们没有共同的祖先?

5 个答案:

答案 0 :(得分:109)

我遇到了你之前描述的同样的问题。为了制作程序化子视图(在您的情况下为paymentTextField),您必须先将其添加到子视图中,然后应用约束。

首先将子视图添加到视图中,这样可确保两个视图具有相同的父视图。

很晚,但希望这可以帮助其他人。

答案 1 :(得分:16)

此问题的清单:

  • 检查是否在激活约束
  • 之前将以编程方式创建的视图添加到其父
  • 检查是否在 viewDidLoad()/ viewWillAppear()中编写约束激活码。您应该在 updateViewConstraints或viewWillLayoutSubviews 中编写约束激活码。 (suggested by vmeyer
  • 检查您是否关闭 translatesAutoresizingMaskIntoConstraints

答案 2 :(得分:10)

错误表明"因为他们没有共同的祖先",这意味着他们不会共享同一个父母。为了将两个项目之间的约束联系起来,它们必须具有子父关系或兄弟关系。

在您的情况下,只需确保它们在以编程方式添加约束之前具有相同的父视图。

答案 3 :(得分:3)

确保已将paymentTextField添加到视图:

paymentTextField.translatesAutoResizingMaskIntoConstraints = false
view.addSubview(paymentTextField)

...

添加约束,例如paymentTextField.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true

答案 4 :(得分:1)

let nameLabel: UILabel = {

   let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

如果您忘记设置此label.translatesAutoresizingMaskIntoConstraints = false         或者如果您在约束之后添加子视图 这个问题出现了