UITextView 根据内容动态改变高度?

Posted

技术标签:

【中文标题】UITextView 根据内容动态改变高度?【英文标题】:UITextView dynamically change height based on content? 【发布时间】:2020-06-06 12:57:54 【问题描述】:

我被这个问题困扰了一段时间,所以我希望能得到一些帮助。我有一个使用 UITextView 的 SwiftUI 应用程序,但是当我将内容放入其中时,文本不会换行。这个 SwiftUI 视图我正在显示和编辑文本,但它目前都不适用。

第二个框中的文字更长,但高度没有变化。

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
    

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

谢谢!

【问题讨论】:

【参考方案1】:

这是一个可以工作的自定义文本视图,可以包裹文本并调整高度:


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
    
  


【讨论】:

以上是关于UITextView 根据内容动态改变高度?的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 内容在增加高度时改变位置

根据内容的 UITextView 高度在 iOS 9 中是错误的

如何让 UITextView 根据内容动态调整自身大小

SWIFT - 改变 UITextView 的高度,xcode 6 GM

SWIFT - 改变 UITextView 的高度,xcode 6 GM

怎么让textView随着输入内容的改变动态改变宽和高