iOS:对齐两个UILabels'领先和尾随

时间:2017-08-01 06:54:54

标签: ios uilabel ios-autolayout

我需要对齐两个UILabel的前导和尾随,例如,我希望两个标签像这样对齐(方括号表示标签'帧):

label1 =      [Hello World in Big Font]
label2 =      [welcome to the world in
               smaller font that wraps
               into two multiple lines]

但结果是

label1 =      [                          Hello World in Big Font                      ]
label2 =      [welcome to the world in smaller font that wraps into two multiple lines]

我知道我可以调整第二个标签的首选字体宽度,但有更好的方法吗?

谢谢!

6 个答案:

答案 0 :(得分:0)

为第二个标签添加宽度约束,使其等于第一个标签的宽度。

答案 1 :(得分:0)

请试试这个

label1.text = "your text"
label1.sizeToFit()

label2.frame.size = label1.frame.size
label2.numberOfLines = 0
label2.text = "your long text"

答案 2 :(得分:0)

SnapKit

很容易
label1.textAlignment = .left
self.view.addSubview(label1)
label1.snp.makeConstraints { (make) -> Void in
    make.height.left.top.equalTo(21)
    make.right. lessThanOrEqualTo(self.view).offset(-20)
}
label2.textAlignment = .left
label2.numberOfLines = 0
self.view.addSubview(label2)
label2.snp.makeConstraints { (make) -> Void in
    make.left.right.equalTo(label1)
    make.top.equalTo(label1.snp.bottom).offset(20)
}

使用不带SnapKit的AutoLayout

        let label1 = UILabel()
        label1.textAlignment = .left
        self.view.addSubview(label1)
        let constraintOne = NSLayoutConstraint.init(item: label1, attribute: .left, relatedBy: .equal, toItem: self.view, attribute: .left, multiplier: 1, constant: 20)
        let constraintTwo = NSLayoutConstraint.init(item: label1, attribute: .right, relatedBy: .lessThanOrEqual, toItem: self.view, attribute: .right, multiplier: 1, constant: -20)
        let constraintThree = NSLayoutConstraint.init(item: label1, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 20)
        let constraintFour = NSLayoutConstraint.init(item: label1, attribute: .top, relatedBy: .greaterThanOrEqual, toItem: self.view, attribute: .top, multiplier: 1, constant: 20)
        let label2 = UILabel()
        label2.textAlignment = .left
        label2.numberOfLines = 0
        self.view.addSubview(label2)
        let layoutConstraintOne = NSLayoutConstraint.init(item: label2, attribute: .left, relatedBy: .equal, toItem: label1, attribute: .left, multiplier: 1, constant: 0)
        let layoutConstraintTwo = NSLayoutConstraint.init(item: label2, attribute: .right, relatedBy: .equal, toItem: label1, attribute: .right, multiplier: 1, constant: 0)
        let layoutConstraintThree = NSLayoutConstraint.init(item: label2, attribute: .top, relatedBy: .equal, toItem: label1, attribute: .bottom, multiplier: 1, constant: 20)
        NSLayoutConstraint.activate([constraintOne, constraintTwo, constraintThree, constraintFour,layoutConstraintOne, layoutConstraintTwo,layoutConstraintThree ])

答案 3 :(得分:0)

对于第一个标签,您只能应用顶部和前导约束。因此对于第二个标签,设置前导,宽度与第一个标签相同。

答案 4 :(得分:0)

尝试了几种方法之后,我找到了一种方法。

我没有对标签的前导和尾随进行约束,而是将它们全部放在中心X w.r.t superview中,并在视图控制器中viewDidLayoutSubviews

[label1 sizeToFit]

确保frame的{​​{1}}仅适用于其文字,然后我这样做:

label1

并声明label2.preferredMaxLayoutWidth = label1.bounds.size.width

  

多行标签的首选最大宽度(以磅为单位)。

     

当应用布局约束时,此属性会影响标签的大小。在布局期间,如果文本超出此属性指定的宽度,则附加文本将流向一个或多个新行,从而增加标签的高度。

确保preferredMaxLayoutWidth'文字符合label2的宽度边界,如果宽度不足以显示单行文字,则会分成多行。

答案 5 :(得分:0)

尝试将第一个标签的内容优先级设置为.defaultHigh + 1.0