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

时间:2015-08-02 21:15:35

标签: ios swift autolayout visual-format-language

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

1 个答案:

答案 0 :(得分:3)

有几个有些相关的答案,但以下是完成这项工作所需的所有部分:

1)我需要创建一个像

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

这使用Swift的域特定语言“可视格式语言”(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)