在 SwiftUI 中控制 TextEditor 的大小

Posted

技术标签:

【中文标题】在 SwiftUI 中控制 TextEditor 的大小【英文标题】:Controlling size of TextEditor in SwiftUI 【发布时间】:2021-08-31 17:15:10 【问题描述】:

我想在我的 ForEach 中有一些 TextEditor,我把这个示例代码写下来了!正如您在 Image 中看到的代码和结果,TextEditor 就像一个贪婪的视图,并占用所有可用空间!至少对我来说有很多缺点!

如果我将高度限制为自定义值,那么我将失去查看 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!"]
    

当前代码结果:

我的目标结果:

【问题讨论】:

这是否回答了您的问题***.com/a/64357649/12299030?这也很有帮助***.com/a/62621521/12299030。 好的,非常感谢。 【参考方案1】:

您可以使用PreferenceKey 和不可见的Text 覆盖来测量字符串尺寸并设置TextEditor 的框架:


struct TextEditorView: View 
    
    @Binding var string: String
    @State var textEditorHeight : CGFloat = 20
    
    var body: some View 
        
        ZStack(alignment: .leading) 
            Text(string)
                .font(.system(.body))
                .foregroundColor(.clear)
                .padding(14)
                .background(GeometryReader 
                    Color.clear.preference(key: ViewHeightKey.self,
                                           value: $0.frame(in: .local).size.height)
                )
            
            TextEditor(text: $string)
                .font(.system(.body))
                .frame(height: max(40,textEditorHeight))
                .cornerRadius(10.0)
                            .shadow(radius: 1.0)
        .onPreferenceChange(ViewHeightKey.self)  textEditorHeight = $0 
        
    
    



struct ViewHeightKey: PreferenceKey 
    static var defaultValue: CGFloat  0 
    static func reduce(value: inout Value, nextValue: () -> Value) 
        value = value + nextValue()
    

改编自我的其他答案:Mimicking behavior of iMessage with TextEditor for text entry

【讨论】:

谢谢,它很好用,我想知道 TextEditor 是否为我们提供了这个选项? 不——这就是为什么我们必须使用这样的解决方案。

以上是关于在 SwiftUI 中控制 TextEditor 的大小的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI for MacOS 中的多行 TextField/TextEditor 表单

在 SwiftUI 中,为啥 Spacer 会将文本推送到 TextEditor 框架之外?

如何在 SwiftUI TextEditor 中获取用户选择的文本

如何防止 TextEditor 在 SwiftUI 中滚动?

SwiftUI 中 TextEditor 的透明背景

为啥我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType?