如何设置自适应多行UILabel文本?

时间:2014-06-10 07:08:23

标签: ios swift

我的 storyboard 笔尖中有一个名为UILabel的{​​{1}}设置为默认高度。我希望以编程方式扩展高度以适应它的内容。这是我到目前为止所尝试的:

titleLabel

这对我来说无论如何都不适用!我总是只在// just setting content titleLabel.text = "You don't always know what you are getting with mass-market cloud computing services. But with SimpliCompute, the picture is clear. SimpliCompute gives you powerful virtual servers you can deploy using just your web browser. That’s enterprise grade technology you can deploy and control on-the-fly." titleLabel.numberOfLines = 0 titleLabel.preferredMaxLayoutWidth = 700 titleLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping titleLabel.sizeToFit() 中看到一行文字。我做错了什么?

我绝对需要文本内容可变。

8 个答案:

答案 0 :(得分:24)

我通过添加自动布局约束来解决问题:

auto layout contraints

但我对此并不满意。经过了大量的试验和错误,无法理解为什么会这样。

此外,我必须在我的titleLabel.numberOfLines = 0

中添加ViewController

答案 1 :(得分:18)

我知道它有点老了但是我最近调查了它:

let l = UILabel()
l.numberOfLines = 0
l.lineBreakMode = .ByWordWrapping
l.text = "BLAH BLAH BLAH BLAH BLAH"
l.frame.size.width = 300
l.sizeToFit()

首先将numberOfLines属性设置为0,以便设备了解您并不关心它需要多少行。 然后指定您最喜欢的BreakMode 然后需要在sizeToFit()方法之前设置宽度。然后标签知道它必须符合指定的宽度

答案 2 :(得分:17)

它应该工作。试试这个

var label:UILabel = UILabel(frame: CGRectMake(10
    ,100, 300, 40));
label.textAlignment = NSTextAlignment.Center;
label.numberOfLines = 0;
label.font = UIFont.systemFontOfSize(16.0);
label.text = "First label\nsecond line";
self.view.addSubview(label);

答案 3 :(得分:4)

使用Xcode中的图形用户界面(GUI),您可以执行以下操作:

  
      
  • 转到" Attribute Inspector"并将Lines值设置为0。默认情况下,它设置为1
  •   
  • 可以通过点击option + return
  • 以多行方式书写标签文字   

enter image description here

  
      
  • 现在,转到" Size Inspector"并设置widthheightX&标签的Y position
  •   

enter image description here

这就是全部。

答案 4 :(得分:0)

以编程方式,迅速

label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.titleView.numberOfLines = 2

答案 5 :(得分:0)

在带有Xcode 10.2的Swift 5中以编程方式

以@La masse解决方案为基础,但使用自动布局来支持旋转

设置视图位置的锚点(左,上,centerY,centerX等)。您还可以使用提供的UIScreen扩展名来设置宽度锚点或动态设置frame.width(以支持旋转)

label = UILabel()
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
self.addSubview(label)
// SET AUTOLAYOUT ANCHORS
label.translatesAutoresizingMaskIntoConstraints = false
label.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 20).isActive = true
label.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -20).isActive = true
label.topAnchor.constraint(equalTo: self.topAnchor, constant: 20).isActive = true
// OPTIONALLY, YOU CAN USE THIS INSTEAD OF THE WIDTH ANCHOR (OR LEFT/RIGHT)
// label.frame.size = CGSize(width: UIScreen.absoluteWidth() - 40.0, height: 0)
label.text = "YOUR LONG TEXT GOES HERE"
label.sizeToFit()

如果使用UIScreen动态设置frame.width:

extension UIScreen {   // OPTIONAL IF USING A DYNAMIC FRAME WIDTH
    class func absoluteWidth() -> CGFloat {
        var width: CGFloat
        if UIScreen.main.bounds.width > UIScreen.main.bounds.height {
            width = self.main.bounds.height // Landscape
        } else {
            width = self.main.bounds.width // Portrait
        }
        return width
    }
}

答案 6 :(得分:0)

extension UILabel {

    var textSize: CGSize { text?.size(withAttributes: [.font: font!]) ?? .zero }

    func setSizeForText(_ str: String, maxWidth: CGFloat) {
        text = str
        let dividedByMaxWidth = Int(textSize.width / maxWidth)
        if dividedByMaxWidth == 0 {
            frame.size = textSize
        } else {
            numberOfLines = dividedByMaxWidth + 1
            frame.size = CGSize(width: maxWidth, height: frame.size.height * CGFloat(numberOfLines))
            sizeToFit()
        }
    }
}

sizeToFit() 最后会将标签的宽度缩小到断字后最宽的行

答案 7 :(得分:0)

这对我有用:

  • numberOfLinesUILabel 属性设置为 0
  • 在将文本分配给 yourLabel.sizeToFit() 后添加此行:UILabel