Fonts 创建一个足够大的SwiftUI文本字段以容纳字符串

Fonts 创建一个足够大的SwiftUI文本字段以容纳字符串,fonts,swiftui,textfield,Fonts,Swiftui,Textfield,我想使用SwiftUI创建一个足够宽的文本字段,以容纳一定数量的数字。它应该考虑到当前字体,所以我不能使用固定值 我知道我可以使用以下命令获取当前字体:() 并将其转换为带表的UIFont:() 并通过执行以下操作获得字符串的宽度: () 最后适当地设置框架: .frame(width: "9999".widthOfString(usingFont: UIFont.with(font: font ?? .body))) 但是由于填充的原因,结果框有点太小,整个过程有点复杂

我想使用SwiftUI创建一个足够宽的文本字段,以容纳一定数量的数字。它应该考虑到当前字体,所以我不能使用固定值

我知道我可以使用以下命令获取当前字体:()

并将其转换为带表的UIFont:()

并通过执行以下操作获得字符串的宽度: ()

最后适当地设置框架:

.frame(width: "9999".widthOfString(usingFont: UIFont.with(font: font ?? .body)))
但是由于填充的原因,结果框有点太小,整个过程有点复杂


有更简单的方法吗?

您可以创建一个具有最长字符串的
文本,并将其隐藏。然后将实际的
文本字段
放入一个
覆盖层

Text("9999999999")
    .opacity(0)
    .overlay(TextField("", text: $text))
extension String {
   func widthOfString(usingFont font: UIFont) -> CGFloat {
        let fontAttributes = [NSAttributedString.Key.font: font]
        let size = self.size(withAttributes: fontAttributes)
        return size.width
    }
}
.frame(width: "9999".widthOfString(usingFont: UIFont.with(font: font ?? .body)))
Text("9999999999")
    .opacity(0)
    .overlay(TextField("", text: $text))