How to align text inside textView vertically?

The above answer is correct, just want to add solution for those updating the textView on real time/onEditing.

Use the above extension and add the delegate method as well.

func textViewDidChange(_ textView: UITextView) { textView.centerVertically() }


If you want to do this using the storyboard, you could add a view inside of your textView. Then, set the constraints that you used for the textView to the new view. Finally, add the following constraints to your text view:

  • (right and left) O and point to the new view
  • using the alignment constraints, add a vertically constraint.

    enter image description here


Link your Text View to your View Controller and name it as you want (let's say textView).

In viewDidLayoutSubviews function put this line:

textView.centerVertically()

Then under the last curly bracket of your class put this extension:

extension UITextView {
    func centerVertically() {
        let fittingSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
        let size = sizeThatFits(fittingSize)
        let topOffset = (bounds.size.height - size.height * zoomScale) / 2
        let positiveTopOffset = max(1, topOffset)
        contentOffset.y = -positiveTopOffset
    }   
}

To use this function in Swift 2.0 just change CGFloat.greatestFiniteMagnitude to CGFloat.max


src: https://github.com/soonin/IOS-Swift-UITextViewAlignTextVertically/blob/master/IOS-Swift-UITextViewAlignTextVertically/Extentions.swift

extension UITextView {
    func centerVerticalText() {
        var topCorrect = (self.bounds.size.height - self.contentSize.height * self.zoomScale) / 2
        topCorrect = topCorrect < 0.0 ? 0.0 : topCorrect
        self.contentInset.top = topCorrect
    }
 }

Edit: It's recommended to call it in layoutSubviews()