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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26721920/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 03:29:10  来源:igfitidea点击:

Adding a subview and position it with constraints programmatically

iosswiftuiviewuilabelautolayout

提问by Isuru

I have added a UIViewusing the IB on to the view controller. Let's call it the redView.

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

enter image description here

在此处输入图片说明

Then I have pinned its all four sides using auto layout constraints in code and when I run it, it looks like this as expected.

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

enter image description here

在此处输入图片说明

Now I want to add a UILabelto this view programmatically and position it in the center using auto layout constraints.

现在我想以UILabel编程方式向这个视图添加一个并使用自动布局约束将它放置在中心。

Below is the code I have so far.

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

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])

    }

}

The problem is the label doesn't appear on the redView. Can anyone please tell me what I'm missing here?

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

Thank you.

谢谢你。

回答by Glynbeard

I'm pretty sure you need to also set:

我很确定您还需要设置:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

Otherwise I don't think the constraints will apply to the label.

否则我认为这些限制不适用于标签。

回答by Nikita Kurtin

Note for Swift 2/3

Swift 2/3 的注意事项

It has changed to Boolean property: UIView.translatesAutoresizingMaskIntoConstraints

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

Instead of it previously being:

而不是以前的:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

It is now:

就是现在:

label.translatesAutoresizingMaskIntoConstraints = false

回答by jaiswal Rajan

You need to do this for each UIControl to assign NSConstraints

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

label.translatesAutoresizingMaskIntoConstraints = false