调整UILabel高度以适应文本

131

我有一些标签,我希望将它们的高度调整为文本的高度,这是我现在编写的代码

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
}

编辑:

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


看一下NSString UIKit的附加功能,那里有方法可以计算所需的大小,而不需要创建UILabel。 - Vladimir Gritsenko
@VladimirGritsenko,“sizeWithFont”方法在Swift中不可用 :( - TheBurgerShot
我承认我不是Swift专家,但我相信你可以添加自己的桥接方法。这仍然比创建UILabel来计算大小要好得多。 - Vladimir Gritsenko
@TheBurgerShot sizeWithFont 在 Swift 的 String 中可能不可用,但在 NSString 上是可用的。你仍然可以在 NSString 上调用它。 - Anorak
最终,错误是另外一件事情,与这个方法无关。虽然这可能仍然对其他人有帮助。 - TheBurgerShot
18个回答

3

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

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
}

3

这里是如何在Swift中计算文本高度。你可以从矩形中获取高度,然后设置标签或文本视图等的约束高度。

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)

2

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

2

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
    }

}

1

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

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

2)从故事板中选择您的UILabel并转到尺寸检查器(标尺图标), 3)将“内容压缩阻力优先级”设置为1,适用于所有与您的标签交互的其他UIView(标签、按钮、imageview等)组件。

例如,我的视图中垂直放置了UIImageView、标题标签和描述标签。我将内容压缩阻力优先级设置为UIImageView和标题标签为1,对于描述标签为750。这将使描述标签占用所需的高度。


1
你也可以使用 sizeThatFits 函数。
例如:

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


0
为了使标签在Swift中动态化,不要给高度限制,在Storyboard中将标签的行数设置为0,并给予底部约束。这是我根据内容大小处理动态标签的最佳方式。

0
如果您的UILabel上有动态文本,高度始终在变化(并且没有任何作用),其中一种替代方法是将标签放入UIStackView中。

为什么要在堆栈视图中放置单个标签?这解决了哪些问题,适当的标签约束无法解决? - HangarRash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接