Swift计算文本尺寸方法详解
在 iOS 开发中,计算文本的尺寸是个蛮常见的任务,尤其是在布局和动态调整 UI 时。Swift 给了几种方法来计算文本的宽高,以便更好地显示内容。过去,通常用UILabel
的textRect(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 调整起来也会方便不少。
57.55KB
文件大小:
评论区