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