有没有办法禁用SwiftUI的文本自动孤立修复?

mklgxw1f  于 2022-12-03  发布在  Swift
关注(0)|答案(2)|浏览(137)

我正在构建一个记忆应用程序,点击键盘上的一个按钮,从预定的字符串中提取下一个单词,并将其添加到输出的文本中,如下所示:

struct TypingGameView: View {
   @State var text: String = "Some text that wraps at the incorrect spot and is quite annoying."
   @State var outputText: String = ""
   @State private var enteredText: String = ""
   @State private var wordsTapped = 0

   var body: some View {
      ZStack {
         TextField("", text: $enteredText)
            .onChange(of: enteredText) { newValue in
               addToOutputText(newValue)
            }
         Rectangle()
            .foregroundColor(.white)
         VStack {
            Text(outputText)
               .frame(maxWidth: .infinity, alignment: .leading)
               .padding()
            Spacer()
         }
      }
   }

   func addToOutputText(_ val: String) {
      let words = text.components(seperatedBy: " ")

      for (index, word) in words.enumerated() {
         if index = wordsTapped {
            outputText += "\(word) "
            wordsTapped += 1
            return
         }
      }      
   }
}

问题是,第一行的最后一个单词只有在它后面有一个其他单词时才跳到下一行,但一旦后面有更多的单词,就跳回到第一行。见下图:

据我所知,这是SwiftUI中Text视图的一个自动功能,用于防止出现任何孤立单词。我想禁用此功能,因为它会使单词在我创建的视图中跳来跳去。我在UIKit中看到过使用CATextLayer的解决方案(请参阅UILabel和UITextView的换行符不匹配和获取UILabel中的每一行文本)、但我需要一些与SwiftUI @State Package 器一起工作的东西,并希望有一个使用所有SwiftUI的解决方案。最终目标是获得与上述视频相同的功能,但没有自动修复孤儿。

**编辑:**刚刚尝试使用Group,每个单词都有单独的Text视图。仍然执行相同的操作:/

mcdcgff0

mcdcgff01#

为了扩展Wamba的答案,你可以使用零宽度空格,这样如果文本在一行上,它后面就不会有可见的空格,也不可能换行到第三行。

/// This makes the text wrap so that it can have one word on the last line (a widow), by default iOS will leave an extra gap on the second to last line
/// and move the second to last word to the last line. With 2 line text this can make the text look like a column and make the UI look unbalanced.
public extension String {
    var fixWidow: String {
        self + "\u{200B}\u{200B}\u{200B}\u{200B}"
    }
}

// Use case:
Text("a short sentence that often wraps to two lines".fixWidow)

这是一个黑客,我不喜欢它,但应用程序用户看不到黑客代码,只有一个奇怪的用户界面,所以这是可取的,直到苹果最终给SwiftUI相同的功能作为UIKit。

m4pnthwp

m4pnthwp2#

只需在字符串末尾添加三个空格:

let myString: String = "Modo ligth (colores predefinidos claros)."

Text(myString)

let myString: String = "Modo ligth (colores predefinidos claros)."
let myNewString: String = myString + "   " // <- Three additional spaces

Text(myNewString)

相关问题