【问题标题】:How to prevent TextEditor from scrolling in SwiftUI?如何防止 TextEditor 在 SwiftUI 中滚动?
【发布时间】:2020-08-03 18:12:26
【问题描述】:

我正在尝试创建一个 TextEditors 列表作为 SwiftUI 应用程序的一部分。我希望各个编辑器不要滚动,因为它们构成了一个更大的滚动列表。但是,当我将 TextEditors 添加到列表中时,它们会向下压缩,并且每个视图都可以单独滚动。是否有修饰符/技巧可以让 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 应用程序中,以防存在任何平台差异。

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

【问题讨论】:

标签: swift macos swiftui


【解决方案1】:

iOS 15 可以用在initUITextView.appearance().isScrollEnabled = false

init(para: EditorParagraph) {
      self._para = StateObject(wrappedValue: para)
      UITextView.appearance().backgroundColor = .clear
      UITextView.appearance().textDragInteraction?.isEnabled = false
      UITextView.appearance().isScrollEnabled  = false // here
}

var body: some View{
    ZStack {
        Text(para.content.isEmpty ? para.placeholder : para.content)
            .font(.system(size: para.fontSize, weight: para.content.isEmpty ? .thin : .regular))
            .lineSpacing(6)
            .opacity(para.content.isEmpty ? 1 : 0)
            .padding(.all, 8)
            .frame(maxWidth: .infinity, alignment: .leading)
    
        TextEditor(text: $para.content)
            .font(.system(size: para.fontSize, weight: .regular))
            .foregroundColor(.black)
            .lineSpacing(6)
    
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • .fixedSize 修饰符在 iOS 14 中发挥了作用,无需使用 ZStack 和空的 Text 元素。不过,ScrollView 中没有我的。谢谢!
    • 不幸的是它在 ios15 上不起作用
    【解决方案3】:

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

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

    【讨论】:

    • 不适用于 macOS
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2022-01-09
    • 2021-04-18
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多