Swift: 以编程方式在相对于视图底部的位置添加一个字段

Swift: programmatically adding a field in a position relative to the bottom of the view

我想在没有 Interface Builder 的情况下以编程方式执行此操作。我想将 UITextField 添加到我的 iOS 应用程序,与应用程序视图底部保持恒定距离。我看了很多现有的问题和答案。 None 在 Swift 中,这个主题似乎相对没有记录。

那里有几个有些相关的答案,但这里是实现此功能所需的所有部分:

1) 我需要创建一个像

这样的约束
let bottomConstraint : NSLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:[inputBox]-50-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["inputBox": inputBox])[0] as! NSLayoutConstraint

这使用 Swift 的领域特定语言 "visual format language" (VFL):V:[inputBox]-50-|,其中 'V' 表示垂直,50 是像素数, '|'指父视图的底部。

2) 在将约束添加到视图之前,必须将 UITextField 添加到视图中,因此 '|'上面可以找到父视图。

3) 一旦我使用了一个 NSLayoutConstraint,我就必须将它们用于该元素的所有方面的大小调整和定位。因此我不得不添加这两行来描述它的宽度和高度:

let heightConstraint : NSLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:[inputBox(==70)]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["inputBox": inputBox])[0] as! NSLayoutConstraint
let widthConstraint : NSLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:[inputBox(==superview)]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["inputBox": inputBox, "superview":self.view])[0] as! NSLayoutConstraint

4) 为了让我的 UITextField 与 VFL 正确交互,我必须添加这一行:

inputBox.setTranslatesAutoresizingMaskIntoConstraints(false)

综合起来:

let inputBox = UITextField(frame: rect)
inputBox.backgroundColor = UIColor.yellowColor()
inputBox.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(inputBox)

let bottomConstraint : NSLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:[inputBox]-50-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["inputBox": inputBox])[0] as! NSLayoutConstraint
let heightConstraint : NSLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:[inputBox(==70)]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["inputBox": inputBox])[0] as! NSLayoutConstraint
let widthConstraint : NSLayoutConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:[inputBox(==superview)]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["inputBox": inputBox, "superview":self.view])[0] as! NSLayoutConstraint

view.addConstraint(bottomConstraint)
view.addConstraint(heightConstraint)
view.addConstraint(widthConstraint)