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.

  1. Instead of min height of constraint provide max height of 100:

Height Constraint for TextView

  1. 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.