如何在SwiftUI中动态地确定字符串的宽度

11
假设我有一个文本叫做:This。我想要计算出这个文本 This 的宽度,以便我可以给另一个视图的框架分配一个宽度。我该怎么做?
struct BadgeTextView: View {

var text: String

var body: some View {
    Rectangle()
        .fill(Color.red)
    .cornerRadius(3)
        .frame(width: text.???, height: <#T##CGFloat?#>, alignment: <#T##Alignment#>)

}
}  

1
“宽度”不是字符串的固有属性。要确定字符串的宽度,需要考虑字体和字体大小。请确保您也考虑到这一点。 - Sweeper
1个回答

28

这个对 String 的扩展应该基于 Sweeper 的建议,让你可以在给定特定字体的情况下获取 String 的宽度:

extension String {
   func widthOfString(usingFont font: UIFont) -> CGFloat {
        let fontAttributes = [NSAttributedString.Key.font: font]
        let size = self.size(withAttributes: fontAttributes)
        return size.width
    }
}

这将被用作如下:let width = "SomeString".widthOfString(usingFont: UIFont.systemFont(ofSize: 17, weight: .bold))


3
太棒了!我一直在尝试使用GeometryReady和preference(key:value:),但没有成功。 - Atsuo Sakakihara
1
我使用Courier字体,因为它是等宽字体。一个由36个“1”重复组成的字符串的宽度为257.34375,而一个由36个“M”组成的字符串的宽度为492.1875。因为它是等宽字体,这些宽度不应该相同吗? - Greg

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