Adjust UILabel height to text

我有一些标签,我想调整他们的高度,以文本,这是我现在写的代码

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
}

编辑:

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

192136 次浏览

我刚把这个放在操场上,它对我很有用。

Updated for 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

我有强有力的解决方案。

返回文章页面布局译者:

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. of course with this UILabel settings:

title.lineBreakMode = .byWordWrapping
title.numberOfLines = 0

只需设置:

label.numberOfLines = 0

The label automatically adjusts its height based upon the amount of text entered.

如果您需要,我可以创建这个扩展

extension UILabel {
func setSizeFont (sizeFont: CGFloat) {
self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
self.sizeToFit()
}
}

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

下面是如何在 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)

在@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
}
}

在需要动态 Height 作为标签的地方调用这个方法

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
}

如果使用 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

Your UILabel will automatically increase height depending on the text

基于 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
}

Swift 4.0

MessageLabel = UILabel (frame: CGRect (x: 70,y: 60,width: UIScreen.main.bound s.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()

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

这个链接描述了故事板进行相同操作的方法

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
...

And now comes the fun part:

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

The Swift 4.1 extension method to calculate label height:

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
}


}

在 Swift 4.1和 Xcode 9.4.1中

只有 三步

步骤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)

为了使标签动态在迅速,不给高度约束和在故事板使标签行数0也给底部约束,这是最好的方式我处理动态标签根据他们的内容大小。

斯威夫特5号 XCode 11故事板方式。我认为这适用于 iOS9或更高版本。你想要例如“描述”标签得到动态高度,按照下面的步骤:

1)选择描述标签-> 转到属性检查器(铅笔图标) ,设置: Lines: 0 换行: 文字包装

2)从故事板中选择你的 UILabel,然后进入尺寸检查器(标尺图标) , 3)下降到“内容压缩阻力优先于1的所有其他 UIView (标签,按钮,图像视图等)组件与您的标签交互。

例如,在我的视图中有垂直的 UIImageView、 Title Label 和 Description Label。我将 UIImageView 和标题标签的内容压缩阻力优先级设置为1,描述标签的内容压缩阻力优先级设置为750。这将使描述标签采取所需的高度。

还可以使用 sizeThatFits函数。

For example:

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