【发布时间】:2022-08-04 15:56:22
【问题描述】:
我基本上正在构建一个记忆应用程序,点击键盘上的按钮从预定字符串中获取下一个单词,并将其添加到输出文本中,如下所示:
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 and UITextView line breaks don\'t match 和 Get each line of text in a UILabel),但我需要一些可以与 SwiftUI @State 包装器一起使用的解决方案,并且更喜欢使用所有 SwiftUI 的解决方案。最终目标是获得与上述视频相同的功能,但不会自动修复孤儿。
编辑:刚刚尝试使用 Group 和每个单词的内部 Text 视图。仍然做同样的事情:/
-
你找到克服这个问题的方法了吗?
-
@demon9733 到目前为止,我能想到的最好的方法是将所有文本同时显示在屏幕上,但设置为
.foregroundColor(.clear),然后在键入正确的字母时一次设置一个单词为.black.感觉很hacky,占用了大量的系统资源,可能不是很好的可访问性,但它是我所拥有的最好的。