我想在我的ForEach中有一些TextEditor
,我做了这个示例代码!正如您在Image中看到的代码和结果,TextEditor
就像一个贪婪的视图,占用了所有可用的空间!这至少对我来说有很多缺点!
如果我去限制高度为自定义值,那么我将失去看到所有字符串和字符串的文本编辑器本身的行的可能性,我必须向上或向下滚动才能看到其他行,这不是我的设计!
我的目标是,TextEditor
需要的空间,如果我输入新的字符串行,那么它可以增加高度,或者如果我删除字符串行,它可以缩小高度到至少1行!
我想知道我怎么能做到这一点?
struct ContentView: View {
@StateObject var textEditorReferenceType: TextEditorReferenceType = TextEditorReferenceType()
var body: some View {
Text("TextEditorView").bold().padding()
VStack {
ForEach(textEditorReferenceType.arrayOfString.indices, id: \.self, content: { index in
TextEditorView(string: $textEditorReferenceType.arrayOfString[index])
})
}
.padding()
}
}
struct TextEditorView: View {
@Binding var string: String
var body: some View {
TextEditor(text: $string)
.cornerRadius(10.0)
.shadow(radius: 1.0)
}
}
class TextEditorReferenceType: ObservableObject {
@Published var arrayOfString: [String] = ["Hello, World!", "Hello, World!", "Hello, World!"]
}
4条答案
按热度按时间vltsax251#
你可以使用一个
PreferenceKey
和一个不可见的Text
覆盖来测量字符串的尺寸,并设置TextEditor
的框架:改编自我的另一个答案:Mimicking behavior of iMessage with TextEditor for text entry
xcitsw882#
iOS 16原生SwiftUI
在iOS 16中,通过添加
axis: .vertical
和.lineLimit()
,现在可以原生使用常规的textField
linelimit定义了文本域扩展之前的行数。添加一个范围开始定义一个范围内的行文本字段将开始和停止扩展。
WWDC22会议“SwiftUI中的新功能”17:10左右
r1zhe5dt3#
或者你可以用
Form
伙计们示例:
当然,这意味着你必须接受Forms的默认渲染方式,因为就像
.sheet
和SwiftUI中的大多数其他东西一样,Apple没有给我们提供自定义外观的方法。你要么喜欢他们给予我们的东西,要么你想出一个奇怪的黑客,或者你 Package 了一个UIKit实现。有趣的时光。
也许在评论中有人可以为我们解释为什么
TextEditor
神奇地在Form
中正常工作,而在其他地方却不能?或者为什么scaleToFit()
不能与TextEditor
正常工作?或者为什么lineLimit
不能与TextEditor
正常工作?问题太多,答案太少,除非你在苹果工作。t8e9dugd4#
添加
.fixedSize(horizontal: false, vertical: true)
和最小高度为我解决了这个问题。示例: