SwiftUI - Как я могу получить многострочный текст для переноса в UITextView без прокрутки? - PullRequest
1 голос
/ 18 февраля 2020

Я использую оболочку UIViewRepresentable для создания привязываемой многострочной UITextVIew, поскольку все еще не поддерживает многострочной поддержки собственного SwiftUI TextField. Все работает нормально, если в UITextView установлено isScrollEnabled = true.

Есть ли способ получить текст для переноса без прокрутки 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()
    }
}

1 Ответ

1 голос
/ 18 февраля 2020

Просто добавьте это к makeUIView и текст обернется.

view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

Вот полностью обновленная функция makeUIView:

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

    view.isEditable = true
    view.font = UIFont.systemFont(ofSize: 24)
    view.isScrollEnabled = false
    view.view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    view.delegate = context.coordinator
    view.text = text

    return view
  }
...