Swift计算文本尺寸方法详解

在 iOS 开发中,计算文本的尺寸是个蛮常见的任务,尤其是在布局和动态调整 UI 时。Swift 给了几种方法来计算文本的宽高,以便更好地显示内容。过去,通常用UILabeltextRect(forBounds:limitedToNumberOfLines:)方法来做这件事,不过现在这方法有点不太推荐了,是在 Xcode 9 及以上版本,会因为线程问题给你发警告。

现代的做法比较推荐用NSString的扩展方法boundingRect(with:options:attributes:context:),它能在任何线程上都能顺利工作,避免了线程安全的问题。代码也挺简洁的,看看这个例子:

extension String {
  func boundingRect(with constrainedSize: CGSize, font: UIFont, lineSpacing: CGFloat? = nil) -> CGSize {
    let attritube = NSMutableAttributedString(string: self)
    let range = NSRange(location: 0, length: attritube.length)
    attritube.addAttributes([.font: font], range: range)
    if let lineSpacing = lineSpacing {
      let paragraphStyle = NSMutableParagraphStyle()
      paragraphStyle.lineSpacing = lineSpacing
      attritube.addAttribute(.paragraphStyle, value: paragraphStyle, range: range)
    }
    let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
    let context = NSStringDrawingContext()
    let rect = attritube.boundingRect(with: constrainedSize, options: options, attributes: [NSAttributedString.Key.font: font], context: context)
    return rect.size
  }
}

通过这种方式,你不仅能计算普通文本的尺寸,还能富文本、加行间距等情况,效果也蛮不错的。

不过,要注意的是,返回的尺寸带有一些额外的空白区域,是当你设置了行间距或其他布局相关的属性。如果你想要精确的文本区域,还得再做一些调整。另外,NSAttributedString能富文本内容,所以如果文本有多种字体、颜色或者样式,记得使用它,而不是String

这方法对开发动态、响应式界面重要,学会了的话,UI 调整起来也会方便不少。

pdf 文件大小:57.55KB