SwiftUI中包含列表内的TextEditor的动态行高

时间:2020-06-28 09:24:56

标签: swift swiftui

我有一个List,其中包含一个TextEditor

struct ContentView: View {
    @State var text: String = "test"

    var body: some View {
        List((1...10), id: \.self) { _ in
            TextEditor(text: $text)
        }
    }
}

但是随着TextEditor的高度变化,它的项目没有增长。我尝试过.fixedSize()修饰符没有任何运气。我在这里想念什么?

2 个答案:

答案 0 :(得分:12)

您可以在Text中使用不可见的ZStack使其动态。

struct ContentView: View {
    @State var text: String = "test"

    var body: some View {
        List((1...10), id: \.self) { _ in
            ZStack {
                TextEditor(text: $text)
                Text(text).opacity(0).padding(.all, 8) // <- This will solve the issue if it is in the same ZStack
            }
        }
    }
}

请注意,您应该考虑更改字体大小和其他属性以匹配TextEditor

Preview

答案 1 :(得分:2)

据我所见,视图层次结构TextEditor只是UITextView的简单包装,并且没有其他内容可以添加,因此您可以深入了解该层并找到所需的UIKit解决方案或...

以下是在SwiftUI级别处理它的可能方法的演示(其思想是使用Text视图作为包装行为的参考,并对其进行TextEditor的调整)

在Xcode 12b / iOS 14上进行了测试(添加了红色边框以提高可见度)

demo

修改了您的视图:

struct ContentView: View {
    @State var text: String = "test"

    @State private var height: CGFloat = .zero
    var body: some View {
        List {
            ForEach((1...10), id: \.self) { _ in
                ZStack(alignment: .leading) {
                    Text(text).foregroundColor(.clear).padding(6)
                        .background(GeometryReader {
                            Color.clear.preference(key: ViewHeightKey.self, value: $0.frame(in: .local).size.height)
                        })
                    TextEditor(text: $text)
                        .frame(minHeight: height)
                        //.border(Color.red)        // << for testing
                }
                .onPreferenceChange(ViewHeightKey.self) { height = $0 }
            }
        }
    }
}

注意:ViewHeightKey是一个首选项键,用于我的其他解决方案中,因此可以从那里获取

ForEach and GeometryReader: variable height for children?

How to make a SwiftUI List scroll automatically?

Automatically adjustable view height based on text height in SwiftUI