如何防止 TextEditor 在 SwiftUI 中滚动?

Posted

技术标签:

【中文标题】如何防止 TextEditor 在 SwiftUI 中滚动?【英文标题】:How to prevent TextEditor from scrolling in 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,但它似乎无法正常工作 - 行仍然没有正确扩展。

【问题讨论】:

这是否回答了您的问题***.com/questions/62620613/…? 不 - 对不起,我应该提到我尝试过这种方法,但它似乎对我不起作用。 【参考方案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

以上是关于如何防止 TextEditor 在 SwiftUI 中滚动?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI TextEditor 如何隐藏键盘

如何在 MacOS 的 SwiftUI 中向 TextEditor 添加焦点环

如何根据 TextEditor 的文本更改为 SwiftUI 视图设置动画?

SwiftUI 4.0 如何轻松在 iOS 16 中设置 TextEditor 背景色

SwiftUI 4.0 如何轻松在 iOS 16 中设置 TextEditor 背景色

SwiftUI 4.0 如何轻松在 iOS 16 中设置 TextEditor 背景色