UITextView动态调整高度,限制最大高度

时间:2017-03-28 11:25:52

标签: ios swift autolayout uitextview

我希望在键入长字符串时使textview像whatsapp一样调整textview的高度。但是一旦达到最大高度,textview将保持最大高度,textview变为可滚动。回复邮件时,它与whatsapp的文本视图完全相同。

我找到了一种动态调整大小的方法,但是当我将textView.isScrollEnabled = true设置为达到最大高度时,textview将缩小但可以滚动。

如何使textview与whatsapp的textview完全相同?

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(updateHeight), name: NSNotification.Name.UITextViewTextDidChange, object: nil)
    textView.isScrollEnabled = false
    // ...
}

func updateHeight() {
    var contentSize = textView.sizeThatFits(textView.bounds.size)
    contentSize.width = UIScreen.main.bounds.width
    if contentSize.height > UIScreen.main.bounds.height / 5{
        textView.isScrollEnabled = true
        contentSize.height = UIScreen.main.bounds.height / 5
    } else {
        textView.isScrollEnabled = false
    }
    textView.frame.size = contentSize
}

enter image description here

2 个答案:

答案 0 :(得分:1)

extension ViewController : UITextViewDelegate{

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

    let cursorPosition = self.textView.caretRect(for: self.tvChat.selectedTextRange!.start).origin
    let currentLine = Int(cursorPosition.y / self.tvChat.font!.lineHeight)

     UIView.animate(withDuration: 0.3) {
        if currentLine == 0 {
            self.constraintHeightTextView.constant = 56
        }else {
            self.constraintHeightTextView.constant = self.textView.contentSize.height + 8 // Padding
        }
    }
    self.textView.layoutIfNeeded()
    self.view.updateConstraints()
  }
}

self.constraintHeightTextView 是textview高度限制的出口。

当文本在textview中更改时,您可以计算当前正在处理的文本行,并将其约束更新为默认值(在我的情况下为56),如果 currentLine 为0,则将其设置为textView。 contentSize.height。

希望有所帮助

答案 1 :(得分:0)

 var textViewContentSize = textView.sizeThatFits(textView.bounds.size)

这将返回UITextView所需的最小尺寸,以显示其中的所有内容。

以及代码下面的限制使用

if textViewContentSize.height > 200{
   textViewContentSize = CGSize(width: textViewContentSize.height, height: 200)
}

现在您的textview框架如下,

textView.frame = CGRect(origin: textView.frame.origin, size: textViewContentSize)

希望它对你有所帮助。