addSubview如何与intrinsicSizes一起使用?

时间:2017-12-22 21:50:44

标签: ios swift uiview addsubview intrinsic-content-size

以下代码的结果是:我没有看到标签。

我的理解是标签的intrinsicSize允许标签伸展。为什么不发生这种情况?

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(label)
    }

    let label : UILabel = {
        let label = UILabel()
        label.text = "How are you doing today my friend"
        label.backgroundColor = .orange

        return label
    }()
}

2 个答案:

答案 0 :(得分:1)

此:

let label = UILabel()

(0, 0)处创建一个标签,其宽度为0,高度为0。默认情况下,iOS会根据frame为标签的位置,宽度和高度创建约束。

如果要使用标签的内在大小,请禁用框架中约束的创建,并给出标签约束以将其放置在视图中。

例如(将标签添加为子视图后):

label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

或者您可以在创建框架时使用label.intrisicContentSize

label.frame = CGRect(origin: CGPoint(x: 40, y: 100), size: label.intrinsicContentSize)

注意:如果您使用label.intrinsicSize设置frame,则更改标签文字时frame不会更改。您必须再次使用以下内容进行更新:

label.frame.size = label.intrinsicContentSize
更改label.text

实际上,自动布局为标签instrinsicContentSize创建了4个约束,但这些约束的优先级低于从frame创建的约束,因此它们没有任何效果。通过禁用frame中的约束创建,您可以为优先级较低的instrinsicContentSize约束提供影响UILabel布局的机会。

您可以在{{3>}标题为内在内容大小的部分中详细了解此内容。

答案 1 :(得分:0)

内在内容大小而不是内在内容位置保证为标签提供宽度和高度如果它没有严格地具有可能削减其内容的前导和尾随约束,但是至少你必须通过框架布局或自动布局给出标签x,y位置,但要设置

  translatesAutoresizingMaskIntoConstraints to false