How to change the TextView height dynamicly to a threshold and then allow scrolling?
It seems your code requires two changes, and it will work fine.
- Instead of min height of constraint provide max height of 100:
Change code as below:
import UIKit class ViewController: UIViewController, UITextViewDelegate { @IBOutlet weak var messageTextView: UITextView! let messageTextViewMaxHeight: CGFloat = 100 override func viewDidLoad() { super.viewDidLoad() messageTextView.delegate = self } func textViewDidChange(textView: UITextView) { if textView.contentSize.height >= self.messageTextViewMaxHeight { textView.scrollEnabled = true } else { textView.frame.size.height = textView.contentSize.height textView.scrollEnabled = false // textView.isScrollEnabled = false for swift 4.0 } } }
This follows a similar approach to the accepted answer but ensures the textView
is fully constrained in both height states.
(There's a bug in the accepted answer - using a height constraint with a <=
relation is insufficient to fully constrain the textView
when scrolling is enabled, since in this case the view provides no intrinsicContentSize
. You can see this in IB (with scrolling disabled), or at runtime via view debugging.)
This is all that's necessary:
// In IB, set the relation to `=` and the constant to your desired threshold point
// Notice this is a strong reference (since the constraint may get deactivated)
@IBOutlet var textViewHeightConstraint: NSLayoutConstraint!
func textViewDidChange(textView: UITextView)
{
let isOversize = textView.contentSize.height >= textViewHeightConstraint.constant
textViewHeightConstraint.isActive = isOversize
textView.isScrollEnabled = isOversize
}
There's no need to set frames manually, since in both cases auto-layout has us covered.