如何防止TextEditor在SwiftUI中滚动?

时间:2020-08-03 18:12:26

标签: swift macos swiftui

我正在尝试创建TextEditor的列表,作为SwiftUI应用程序的一部分。我希望各个编辑者不要滚动,因为它们构成了较大的滚动列表。但是,当我将TextEditor添加到列表时,它们会向下压缩,并且每个视图都可以单独滚动。是否有修饰符/技巧可以使TextEditor始终适合其文本内容而无需滚动,所以我可以实现这一目标?

下面是我要尝试做的一个最小示例:

struct ParentView: View {
    var items: [Item]

    var body: some View {
        List(items, id: \.id) { item in
            EditorView(item: item)
        }
    }
}

struct EditorView: View {
    @ObservedObject var item: Item

    var body: some View {
         TextEditor(text: $item.text)
    }
}

如果存在平台差异,这是在macOS SwiftUI应用程序中,而不是iOS中的应用程序。

编辑:正如评论中所指出的,我尝试了这种方法Dynamic row hight containing TextEditor inside a List in SwiftUI,但它似乎无法正常工作-行仍然无法正确展开。

3 个答案:

答案 0 :(得分:0)

为解决此问题,我最终使用.fixedSize(horizontal: false, vertical: true)修饰符将TextEditor固定为完整大小,然后使Dynamic row hight containing TextEditor inside a List in SwiftUI中的解决方案可以在列表中按预期工作

答案 1 :(得分:0)

SwiftUI-Introspect 库最近添加了对 TextEditor 的支持。您可以使用它来查找 TextEditor 使用的底层文本视图,并禁用该视图的滚动:

TextEditor(text: $item.text)
    .introspectTextView { textView in
        textView.isScrollEnabled = false
    }

答案 2 :(得分:0)

我的应用有类似的功能,但它是 iOS 的,

需要导入 SwiftUI-Introspect

预览

enter image description here

示例场景:

  • TextEditor 添加到 ScrollViewList
  • TextEditor的高度等于 内容的高度。
  • 禁用TextEditor的滚动手势(处理滚动 同时发出)。

最小示例代码:

import Introspect

struct ExampleView: View {
    @State var note: String = ""
    
    var body: some View {
        ScrollView {
            // TextEditor
            ZStack(alignment: .topLeading) {
                // Provide  size
                HStack(spacing: 0) {
                    Text(note)
                        .foregroundColor(.blue)
                        .padding(.leading, .em_view_space_5)
                    Spacer()
                }
                // Wrapped with GeometryReader: let TextEditor' height equal to content's height when deleting text.
                GeometryReader { proxy in
                    TextEditor(text: $note).introspectTextView { textView in
                        textView.isScrollEnabled = false
                    }
                }
            }
            // Add extra views if you want
            ForEach(0..<10) { index in
                Text("\(index)")
            }
        }
    }
}