使 SwiftUI TextField 足够大以容纳字符串

Posted

技术标签:

【中文标题】使 SwiftUI TextField 足够大以容纳字符串【英文标题】:Make a SwiftUI TextField big enough to fit a string 【发布时间】:2020-11-12 05:47:31 【问题描述】:

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

我知道我可以通过以下方式获取当前字体:(https://***.com/a/62156787/1115020)

@Environment(\.font) var font

并将其转换为带有表格的 UIFont:(https://***.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://***.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)))

但是生成的盒子因为有padding的原因有点太小了,整个过程有点复杂。

有没有更简单的方法?

【问题讨论】:

【参考方案1】:

您可以创建一个具有最长字符串的Text 并将其隐藏。然后将实际的TextField 放入overlay

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

【讨论】:

以上是关于使 SwiftUI TextField 足够大以容纳字符串的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何使 TextField 适合多行内容?

SwiftUI:如何使 TextField 适合多行内容?

如何使表格视图单元格的大小动态变化?

SwiftUI:TextField 内的填充

在 iOS 14 中编辑 TextField 时 SwiftUI 崩溃

SwiftUI:在输入之前将 TextField 大小扩展到字体大小