将UITextView的高度调整为其文本无法正常工作

时间:2016-11-16 01:46:29

标签: ios swift height uitextview

我编写了以下代码,以使UITextView的高度符合其文本。

当我点击键盘上的输入键添加换行符时,尺寸会发生变化,但相对于第一行文字的上边距会相互不同。


设置

  • xCode 7.3
  • 部署目标:iOS 9


import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    lazy var textView: UITextView = {
        let tv = UITextView(frame: CGRectMake(20, 200, (self.view.frame.width - 40), 0) )
        tv.backgroundColor = UIColor.lightGrayColor()
        return tv
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview( textView )

        textView.delegate = self
        let height = self.height(textView)
        let frame = CGRectMake(textView.frame.origin.x, textView.frame.origin.y, textView.frame.width, height)
        textView.frame = frame
    }


    func textViewDidChange(textView: UITextView) {

        let frame = CGRect(x: textView.frame.origin.x, y: textView.frame.origin.y, width: textView.frame.width, height: height(textView) )
        textView.frame = frame
    }


    func height(textView: UITextView) -> CGFloat {
        let size = CGSizeMake(textView.frame.size.width, CGFloat.max)
        let height = textView.sizeThatFits(size).height
        return height
    }
}

enter image description here enter image description here

我尝试了很少的其他方法来适应UITextView的高度,但他们只是采取了相同的说法。

1 个答案:

答案 0 :(得分:1)

要解决此问题,请将UITextView子类化并覆盖setContentOffset,以便仅在内容高度大于内在内容高度时才允许滚动。类似的东西:

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    let allowScrolling = (contentSize.height > intrinsicContentSize.height)
    if allowScrolling {
        super.setContentOffset(contentOffset, animated: animated)
    }
}

对于自动增长的动态高度文本视图,插入符号会在开始新行时移动。此时,文本视图的大小尚未增长到新的大小。文本视图尝试通过滚动不必要的文本内容来使插入符可见。

您可能还需要覆盖intrinsicContentSize。