如何使 TextView 根据内容高度自适应

如何使 TextView 根据内容高度自适应

方法一:

textView.text = "123\ntextview.scrollEnabled = NO\ntextview.scrollEnabled = NO\ntextview.scrollEnabled = NO\ntextview.scrollEnabled = NO\ntextview.scrollEnabled = NO\ntextview.scrollEnabled = NO\ntextview.scrollEnabled = NO"
        self.textView.scrollEnabled = false
        let fixedWidth = textView.frame.size.width
        textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        var newFrame = textView.frame
        newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
        println (newSize.height)
        textView.frame = newFrame // 如果没有禁用 autoLayout,高度会重新计算,但显示的时候没有效果

这种方法需要禁用use Auto Layout,否则不能生效

方法二

    @IBOutlet weak var heightConstraint: NSLayoutConstraint!
    @IBOutlet weak var textView: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()

        // 设置 textView的高度自适应
        self.textView.scrollEnabled = false
        let fixedWidth = textView.frame.size.width
        textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        var newFrame = textView.frame
        newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
        textView.frame = newFrame;
        self.heightConstraint.constant = self.textView.sizeThatFits(textView.frame.size).height
    }

方法二种前面获得内容高度的方法和方法一是一样的,不同的是使用 autoLayout 的 constraint 来设置 textView 的高度。
首先要在storyboard 中对 textView 增加高度的约束,然后将这个约束在代码中对应一个 IBOutlet,即上面的heightConstraint,然后在代码中对其赋值

参考《How do I size a UITextView to its content?》

另外,发现在 navigationController下, textView 显示的时候会发现内容不是从顶部开始的,在最上面会有一段空白。


设置 textView 所在 viewController 的automaticallyAdjustsScrollViewInsets属性为 false 可解决
self.automaticallyAdjustsScrollViewInsets = false

2015-09-18 10:41140