首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Swift中根据字符串计算UILabel的大小

在Swift中根据字符串计算UILabel的大小
EN

Stack Overflow用户
提问于 2015-05-26 13:50:47
回答 10查看 157.7K关注 0票数 206

我正在尝试根据不同的字符串长度来计算UILabel的高度。

代码语言:javascript
复制
func calculateContentHeight() -> CGFloat{
    var maxLabelSize: CGSize = CGSizeMake(frame.size.width - 48, CGFloat(9999))
    var contentNSString = contentText as NSString
    var expectedLabelSize = contentNSString.boundingRectWithSize(maxLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16.0)], context: nil)
    print("\(expectedLabelSize)")
    return expectedLabelSize.size.height

}

上面是我用来确定高度的当前函数,但它不起作用。如果我能得到任何帮助,我将不胜感激。我更喜欢用Swift而不是Objective C来回答。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2015-05-26 13:59:13

String上使用扩展

Swift 3

代码语言:javascript
复制
extension String {
    func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
    
        return ceil(boundingBox.height)
    }

    func width(withConstrainedHeight height: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

        return ceil(boundingBox.width)
    }
}

NSAttributedString上也是如此(这有时非常有用)

代码语言:javascript
复制
extension NSAttributedString {
    func height(withConstrainedWidth width: CGFloat) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, context: nil)
    
        return ceil(boundingBox.height)
    }

    func width(withConstrainedHeight height: CGFloat) -> CGFloat {
        let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
        let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, context: nil)
    
        return ceil(boundingBox.width)
    }
}

Swift 4和5

只需在extension String方法中更改attributes的值

从…

代码语言:javascript
复制
[NSFontAttributeName: font]

代码语言:javascript
复制
[.font : font]
票数 587
EN

Stack Overflow用户

发布于 2016-11-17 18:41:53

对于多行文本,此答案不能正常工作。您可以使用UILabel构建不同的字符串扩展

代码语言:javascript
复制
extension String {
func height(constraintedWidth width: CGFloat, font: UIFont) -> CGFloat {
    let label =  UILabel(frame: CGRect(x: 0, y: 0, width: width, height: .greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.text = self
    label.font = font
    label.sizeToFit()

    return label.frame.height
 }
}

UILabel获得固定宽度,并且.numberOfLines被设置为0。通过添加文本并调用.sizeToFit(),它会自动调整到正确的高度。

代码是用Swift 3编写的

票数 18
EN

Stack Overflow用户

发布于 2019-07-02 03:51:04

这里有一个简单的解决方案,对我来说是有效的。与其他一些帖子类似,但不包括调用sizeToFit的需要

请注意,这是用Swift 5编写的

代码语言:javascript
复制
let lbl = UILabel()
lbl.numberOfLines = 0
lbl.font = UIFont.systemFont(ofSize: 12) // make sure you set this correctly 
lbl.text = "My text that may or may not wrap lines..."

let width = 100.0 // the width of the view you are constraint to, keep in mind any applied margins here

let height = lbl.systemLayoutSizeFitting(CGSize(width: width, height: UIView.layoutFittingCompressedSize.height), withHorizontalFittingPriority: .required, verticalFittingPriority: .fittingSizeLevel).height

这处理换行之类的事情。不是最优雅的代码,但它可以完成工作。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30450434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档