将UILabel高度调整为文本

时间:2014-08-07 10:43:12

标签: ios swift height uilabel frame

我有一些标签,我想调整它们的高度到文本,这是我为此写的代码

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

修改

问题不在于这段代码,所以我的修复本身就是问题。它可能对其他人有用!

17 个答案:

答案 0 :(得分:165)

我只是把它放在操场上,它对我有用。

针对Swift 4.0进行了更新

import UIKit

 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

let font = UIFont(name: "Helvetica", size: 20.0)

var height = heightForView("This is just a load of text", font: font, width: 100.0)

斯威夫特3:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    return label.frame.height
}

enter image description here

答案 1 :(得分:57)

如果您使用的是AutoLayout ,则只能通过配置UI调整UILabel高度。

适用于iOS8或以上

  • UILabel
  • 设置约束前导/尾随
  • 并将UILabel的行从1更改为0

enter image description here

适用于iOS7

  • 首先,您需要为UILabel
  • 添加包含高度
  • 然后,修改从EqualGreater than or Equal
  • 的关系

enter image description here

  • 最后,将UILabel的行从1更改为0

enter image description here

UILabel会根据文字

自动增加高度

答案 2 :(得分:8)

如果你想要

我创建这个扩展名
extension UILabel {
    func setSizeFont (sizeFont: CGFloat) {
        self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
        self.sizeToFit()
    }
}

答案 3 :(得分:7)

我有很好的工作解决方案。

layoutSubviews中的

    _title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
    _title.sizeToFit()
    _title.frame.size = _title.bounds.size
文本设置器中的

    _title.text = newValue
    setNeedsLayout()

<强> UPD。 当然还有这个UILabel设置:

    _title.lineBreakMode = .ByWordWrapping
    _title.numberOfLines = 0

答案 4 :(得分:6)

只需设置:

label.numberOfLines = 0

标签会根据输入的文字数量自动调整其高度。

答案 5 :(得分:5)

根据Anorak的回答,我也同意Zorayr的关注,所以我添加了几行来删除UILabel并仅返回CGFloat,我不知道它是否有帮助因为原始代码没有添加UIabel,但它不会抛出错误,所以我使用下面的代码:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{

    var currHeight:CGFloat!

    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    currHeight = label.frame.height
    label.removeFromSuperview()

    return currHeight
}

答案 6 :(得分:3)

Anorak建议的解决方案是UILabel扩展中的计算属性:

extension UILabel
{
var optimalHeight : CGFloat
    {
        get
        {
            let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
            label.numberOfLines = 0
            label.lineBreakMode = self.lineBreakMode
            label.font = self.font
            label.text = self.text

            label.sizeToFit()

            return label.frame.height
         }
    }
}

用法:

self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight)

答案 7 :(得分:3)

在@Anorak回答之后,我将此扩展添加到String并发送了一个inset作为参数,因为很多时候你需要填充文本。 无论如何,也许有些你会觉得这很有用。

extension String {

    func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {

        let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = font
        label.text = self

        label.sizeToFit()
        return label.frame.height + insets.top + insets.bottom
    }
}

答案 8 :(得分:3)

在Swift 4.1和Xcode 9.4.1中

3个步骤

步骤1)

//To calculate height for label based on text size and width
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat {
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

第2步)

//Call this function
let height = heightForView(text: "This is your text", font: UIFont.systemFont(ofSize: 17), width: 300)
print(height)//Output : 41.0

第3步)

//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)

答案 9 :(得分:2)

以下是如何计算Swift中的文本高度。然后,您可以从rect获取高度并设置标签或textView等的约束高度

let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"

let textString = text as NSString

let textAttributes = [NSFontAttributeName: font]

let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)

答案 10 :(得分:2)

Swift 4.0

self.messageLabel = UILabel(frame:CGRect(x:70,y:60,width:UIScreen.main.bounds.width - 80,height:30)

messageLabel.text = message

messageLabel.lineBreakMode = .byWordWrapping //in versions below swift 3 (messageLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping)    
messageLabel.numberOfLines = 0 //To write any number of lines within a label scope

messageLabel.textAlignment = .center

messageLabel.textColor = UIColor.white

messageLabel.font = messageLabel.font.withSize(12)

messageLabel.sizeToFit()
  

Blockquote NSParagraphStyle.LineBreakMode,适用于整个段落,而不是段落中的单词。此属性在正常绘制期间以及必须减小字体大小以适合其边界框中的标签文本的情况下都有效。默认情况下,此属性设置为byTruncatingTail。

This link describes the storyboard way of doing the same

答案 11 :(得分:1)

只需调用此方法,您需要标签

的动态高度
func getHeightforController(view: AnyObject) -> CGFloat {
    let tempView: UILabel = view as! UILabel
    var context: NSStringDrawingContext = NSStringDrawingContext()
    context.minimumScaleFactor = 0.8

    var width: CGFloat = tempView.frame.size.width

    width = ((UIScreen.mainScreen().bounds.width)/320)*width

    let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize

    return size.height
}

答案 12 :(得分:1)

Swift 4.0

我只是在插入(动态)文本后调整标签大小,而不是计算文本/标签高度。

假设myLabel是有问题的UILabel:

let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...

现在有趣的是:

var myLabelText: String = "" {
   didSet {
      myLabel.text = myLabelText
      myLabel.sizeToFit()
   }
}

答案 13 :(得分:0)

用于计算标签高度的 Swift 4.1 扩展方法:

extension UILabel {

    func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
        let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.text = text

        label.sizeToFit()
        return label.frame.height
    }

}

答案 14 :(得分:0)

要使标签快速动态显示,请不要给出高度限制,在情节提要中,使标签行数0也给出底部约束,这是我根据其内容大小处理动态标签的最佳方法。

答案 15 :(得分:0)

Swift 5,XCode 11故事板方式。我认为这适用于iOS 9及更高版本。例如,您想要“描述”标签来获取动态高度,请按照以下步骤操作:

1)选择描述标签->转到“属性检查器”(铅笔图标),设置: 行数:0 换行符:自动换行

2)从情节提要中选择您的UILabel,然后转到Size Inspector(大小图标), 3)转到“与标签交互的所有其他UIView组件(标签,按钮,imageview等)的“内容压缩优先级为1”。

例如,我的视图中垂直具有UIImageView,标题标签和描述标签。我将UIImageView的Content Compression Resistance Priority设置为1,将标题标签设置为750,并将描述标签设置为750。这将使描述标签占据所需高度。

答案 16 :(得分:0)

您还可以使用sizeThatFits函数。

例如:

label.sizeThatFits(superView.frame.size).height