I want to align vertically the text inside my UITextView (so it will be in the middle of it). How can i achieve that? I looked up and could not find any answer that could h
inside viewDidLoad()
:
textView.textAlignment = .center
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:
using the alignment constraints, add a vertically constraint.
This is used to center the text horizontal.
Link your textview to your viewcontroller 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 for swift2
just change CGFloat.greatestFiniteMagnitude
to CGFloat.max
Put the following extension below your last curly bracket in your ViewController:
// MARK: - UITextView extension
extension UITextView {
func centerVerticalText() {
self.textAlignment = .center
let fitSize = CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
let size = sizeThatFits(fitSize)
let calculate = (bounds.size.height - size.height * zoomScale) / 2
let offset = max(1, calculate)
contentOffset.y = -offset
}
}
Call this function after you set the text.
yourTextView.centerVerticalText()
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()
}