添加子视图并以编程方式使用约束对其进行定位

Isu*_*uru 18 uiview uilabel ios autolayout swift

我已经UIView在视图控制器上添加了一个IB.我们称之为redView.

在此输入图像描述

然后我在代码中使用自动布局约束固定了它的所有四个边,当我运行它时,它看起来像预期的那样.

在此输入图像描述

现在我想以UILabel编程方式向该视图添加一个并使用自动布局约束将其定位在中心.

下面是我到目前为止的代码.

import UIKit

class ViewController: UIViewController {

    @IBOutlet private var redView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        redView.setTranslatesAutoresizingMaskIntoConstraints(false)

        let leadingConstraint = NSLayoutConstraint(item: redView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 0)
        let trailingConstraint = NSLayoutConstraint(item: redView, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1, constant: 0)
        let topConstraint = NSLayoutConstraint(item: redView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0)
        let bottomConstraint = NSLayoutConstraint(item: redView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1, constant: 0)
        view.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])


        let label = UILabel()
        label.text = "Auto Layout Exercise"
        redView.addSubview(label)

        let xCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: redView, attribute: .CenterX, multiplier: 1, constant: 0)
        let yCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: redView, attribute: .CenterY, multiplier: 1, constant: 0)
        let leadingConstraint1 = NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: redView, attribute: .Leading, multiplier: 1, constant: 20)
        let trailingConstraint1 = NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: redView, attribute: .Trailing, multiplier: 1, constant: -20)
        redView.addConstraints([xCenterConstraint, yCenterConstraint, leadingConstraint1, trailingConstraint1])

    }

}
Run Code Online (Sandbox Code Playgroud)

问题是标签没有出现在redView.谁能告诉我我在这里缺少什么?

谢谢.

Gly*_*ard 37

我很确定你还需要设置:

label.setTranslatesAutoresizingMaskIntoConstraints(false)
Run Code Online (Sandbox Code Playgroud)

否则我认为约束不适用于标签.


Nik*_*tin 13

Swift 2/3的注意事项

它已更改为布尔属性:UIView.translatesAutoresizingMaskIntoConstraints

而不是以前:

label.setTranslatesAutoresizingMaskIntoConstraints(false)
Run Code Online (Sandbox Code Playgroud)

就是现在:

label.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)


jai*_*jan 5

您需要为每个 UIControl 执行此操作以分配 NSConstraints

label.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)