将UILabel高度调整为文本

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

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 } 

编辑:

这个问题不在一段代码中,所以我的问题本身就是一个问题。 它可能对别人有用!

我只是把它放在一个操场上,对我来说很有用。

 import UIKit 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 } let font = UIFont(name: "Helvetica", size: 20.0) var height = heightForView("This is just a load of text", font: font, width: 100.0) 

Swift 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 } 

在这里输入图像描述

如果您使用AutoLayout ,则只能通过configurationUI调整UILabel高度。

对于iOS8或更高版本

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

在这里输入图像描述

对于iOS7

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

在这里输入图像描述

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

在这里输入图像描述

你的UILabel会根据文字自动增加高度

如果你愿意,我可以创build这个扩展

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

只需设置:

 label.numberOfLines = 0 

标签根据input的文本量自动调整其高度。

我有强大的工作解决scheme。

在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 

在@Anorak答案之后,我将这个扩展添加到String,并发送一个插入作为参数,因为很多时候你需要一个填充到你的文本。 无论如何,也许你会发现这个有用的。

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

Anorakbuild议的解决scheme是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中的文本高度。 然后,您可以从矩形中获取高度,并设置标签或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的回答,我也同意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 } 

只需要调用这个方法,你需要标签的dynamic高度

 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 }