我试图根据不同的字符串长度计算UILabel的高度.

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而不是客观C来回答.

推荐答案

使用String上的分机

Swift 3

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(这有时非常有用)

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

从…

[NSFontAttributeName: font]

[.font : font]

Ios相关问答推荐

为什么Pushed View Controller在UIKit中具有导航控制器?

如何正确测试后台URLSessionDownloadTask?

RN 0.63支持iOS ProMotion?

如何解释在SwiftUI视图中观察到持续的数据更改

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

@Query与SwiftData数据列表绑定

SwiftUI 故障/错误 - 在 LazyVStack 和 ScrollView 中使用 AVPlayer 时状态栏不显示

表视图(SwiftUI)中的多列?

如何在 SwiftUI 中创建显示当前电池电量的电池徽章

如何在 SwiftUI 中只显示一次随机数组的项目?

iOS 是否支持使用独立 .xib 文件创建的嵌套自定义子视图?

SwiftUI NavigationLink 立即加载目标视图,无需单击

CocoaPods 找不到 podFirebase/Core的兼容版本 | cloud_firestore, Flutter

界面生成器中 UIView 的边框 colored颜色 不起作用?

所有小部件的Flutter 填充?

如何在 Objective-C 中组合两个数组?

文本未包含在 swift UI 中

如何在ios中生成UUID

从 Swift 转换为 Objective-c 的工具

NSURL 到带有 XCTest 的测试包中的文件路径