UITextView根据内容动态更改高度吗?

问题描述 投票:0回答:1

我对此问题感到困惑,所以希望得到一些帮助。我有一个使用UITextView的SwiftUI应用程序,但是当我在其中放置内容时,文本不会自动换行。我正在同时显示和编辑文本的这个SwiftUI视图,但目前都无法使用。

Example of my text not working

第二个框中的文本更长,但高度不变。

func makeUIView(context: Context) -> UITextView {
        view.isScrollEnabled = false
        view.isEditable = editable
        view.isUserInteractionEnabled = true
        view.contentInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
        view.text = self.text

        // For debugging
        view.layer.borderColor = UIColor.black.cgColor
        view.layer.borderWidth = 1.0

        var fontPref = UIFont.preferredFont(forTextStyle: render.font)
        if render.bold && render.italic {
            fontPref = fontPref.bolditalic()
        } else if render.bold {
            fontPref = fontPref.bold()
        } else if render.italic {
            fontPref = fontPref.italic()
        }

        view.font = fontPref
        view.textColor = render.color
        view.textAlignment = render.align
        view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
        view.textContainer.lineBreakMode = .byWordWrapping

        view.delegate = context.coordinator

        return view
    }

我已经尝试了一些解决方案,但没有一个适合我的用例。

谢谢!

swift uikit swiftui uitextview
1个回答
0
投票

这里是一个有效的自定义文本视图,用于包装文本并调整高度:


import SwiftUI

struct NoteTextView: UIViewRepresentable {
  func makeCoordinator() -> Coordinator {
    Coordinator(self)
  }

  @Binding var text: String
  var onEndEditing: () -> Void

  typealias UIViewType = UITextView
  var configuration = { (view: UIViewType) in }

  func makeUIView(context: UIViewRepresentableContext<Self>) -> UIViewType {
    let textField = UIViewType()
    textField.delegate = context.coordinator
    textField.font = UIFont.preferredFont(forTextStyle: .body)
    textField.text = text
    textField.isScrollEnabled = true
    textField.isEditable = true
    textField.isUserInteractionEnabled = true

    return textField
  }

  func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<Self>) {
    uiView.text = text
    configuration(uiView)
  }

  class Coordinator : NSObject, UITextViewDelegate {

    var parent: NoteTextView

    init(_ uiTextView: NoteTextView) {
      self.parent = uiTextView
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
      return true
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.