使SwiftUI TextField足够大以适合字符串

时间:2020-11-12 05:47:31

标签: fonts swiftui textfield

我想使用SwiftUI制作一个足够宽的TextField以容纳一定数量的数字。应该考虑当前字体,所以我不能使用固定值。

我知道我可以使用({https://stackoverflow.com/a/62156787/1115020

获得当前字体。
@Environment(\.font) var font

并将其转换为带有表的UIFont:(https://stackoverflow.com/a/64491669/1115020

extension UIFont {
    class func with(font: Font) -> UIFont {
        let uiFont: UIFont
        
        switch font {
        case .largeTitle:
            uiFont = UIFont.preferredFont(forTextStyle: .largeTitle)
        case .title:
            uiFont = UIFont.preferredFont(forTextStyle: .title1)
        case .title2:
...

并通过执行以下操作获得字符串的宽度: (https://stackoverflow.com/a/58782429/1115020

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)))

但是由于填充,结果框太小了,整个过程有点复杂。

有没有更简单的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用最长的字符串创建一个Text并将其隐藏。然后将实际的TextField放在overlay中:

Text("9999999999")
    .opacity(0)
    .overlay(TextField("", text: $text))