Ios 将UILabel高度调整为文本

Ios 将UILabel高度调整为文本,ios,swift,height,uilabel,frame,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 = NSLineBr

我有一些标签,我想调整它们的高度,以适应文本,这是我现在为此编写的代码

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
}
编辑:

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
}

问题不在这段代码中,所以我的解决方法是问题本身。它可能对其他人仍然有用

我刚把它放在操场上,它对我很管用

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

我有很强的工作解决方案

在布局子视图中:

    _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
仅通过设置:

label.numberOfLines = 0

标签将根据输入的文本量自动调整其高度

如果您需要,我将创建此扩展

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获取高度,并设置标签或文本视图的约束高度等

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 answer之后,我将这个扩展名添加到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
    }
}

只要在需要标签的动态高度时调用此方法即可

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

对于iOS7

  • 首先,您需要为
    UILabel
  • 然后,将关系从
    Equal
    修改为
    大于或等于

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


根据Anorak的回答,您的
UILabel
将根据文本自动增加高度,我也同意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

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)
self.messageLabel=UILabel(帧:CGRect(x:70,y:60,宽度:UIScreen.main.bounds.width-80,高度:30)

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


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)
我没有计算文本/标签高度,而是在插入(动态)文本后调整标签的大小

假设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()
   }
}

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
    }

}

在swift 4.1和Xcode 9.4.1中

3个步骤

步骤1)

步骤2)

步骤3)


要在swift中使标签动态,请不要指定高度常量,在情节提要中,使标签行数0也指定底部约束,这是我根据内容大小处理动态标签的最佳方式。

swift 5,XCode 11情节提要方式。我认为这适用于iOS 9及更高版本。例如,如果希望“描述”标签获得动态高度,请执行以下步骤:

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

2) 从情节提要中选择UILabel,然后转到尺寸检查器(标尺图标), 3) 对于与标签交互的所有其他UIView(标签、按钮、图像视图等)组件,请转至“内容压缩阻力优先级为1”


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

您还可以使用
sizeThatFits
功能

例如:


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

看看NSString UIKit的添加,有一些方法可以根据需要计算大小,而无需创建UILabel。@VladimirGritsenko“sizeWithFont”方法在Swift中不可用:(我承认我不是Swift方面的专家,但我相信你可以添加自己的桥接方法。与创建UILabel来计算大小相比,这仍然是值得的。@Burgershot
sizeWithFont
可能不适用于Swift
String
,但它可以在
NSString
上使用,你应该仍然能够调用它。最后e错误与此不同,与此方法无关。虽然这可能对其他人仍有帮助。这对游乐场上的mee也适用,错误似乎不会发生在这个特定的地方,当我删除此方法的用法时,它会抱怨一些println或只是一行注释(然后显示EXC_BAD_访问代码=2)它在操场上工作,但在XCode 6.1I中的视图控制器内部不会按需要进行大小调整。我对每次大小调整创建一个新的
UILabel
有点犹豫;如果在
LayoutSubview
内部使用此方法,并且每个完整布局都会被多次调用,那么额外的对象创建可能会引入明显的de放置,尤其是在滚动期间。let textRect=textString.boundingRectWithSize(CGSizeMake(3202000),选项:。使用linefragmentorigin,attributes:texttributes,context:nil)我无法在我的视图控制器中调用此函数…你能建议我什么是pos吗
//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)