SwiftUI - 如何在不滚动的情况下将多行文本包装在 UITextView 中?

raf*_*nes 1 uitextview ios swiftui

我正在使用UIViewRepresentable包装器来创建一个可绑定的多行,UITextVIew因为原生 SwiftUI仍然没有多行支持TextField。只要isScrollEnabled = true在 UITextView 上设置,一切都可以正常工作。

有没有办法让文本在不UITextView滚动的情况下换行?

import SwiftUI

struct TextfieldIssue: View {
  @State var text: String = "Hello, I am some long text that will wrap if isScrollEnabled is set to true, but not if isScrollEnabled is set to false"

  var body: some View {
    MultilineTextField(text: $text)
  }
}

struct MultilineTextField: UIViewRepresentable {

  private let view = UITextView()

  @Binding var text: String

  func makeUIView(context: UIViewRepresentableContext<MultilineTextField>) -> UITextView {

    view.isEditable = true
    view.font = UIFont.systemFont(ofSize: 24)

    // Text wraps fine as long as this is true
    view.isScrollEnabled = true

    // Text does not wrap if this is uncommented
//    view.isScrollEnabled = false

    view.text = text
    view.delegate = context.coordinator

    return view
  }

  func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<MultilineTextField>) {
    uiView.text = text
  }

  func makeCoordinator() -> TextFieldCoordinator {
    let coordinator = TextFieldCoordinator(self)
    self.view.delegate = coordinator

    return coordinator
  }
}

class TextFieldCoordinator : NSObject, UITextViewDelegate {

  var parent: MultilineTextField

  init(_ multilineTextField: MultilineTextField) {
    self.parent = multilineTextField
  }

  func textViewDidChange(_ textView: UITextView) {
    self.parent.text = textView.text
  }
}

struct TextfieldIssue_Previews: PreviewProvider {
    static var previews: some View {
        TextfieldIssue()
    }
}
Run Code Online (Sandbox Code Playgroud)

raf*_*nes 6

只需将此添加到makeUIView文本将换行。

view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Run Code Online (Sandbox Code Playgroud)

这是完整的更新makeUIView功能:

view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Run Code Online (Sandbox Code Playgroud)