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 help me.
Thanks in advance.
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 help me.
Thanks in advance.
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
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()
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:
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()
}
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()
Add this to your extension or extending class of UITextView
public func centerVertically()
{
let iFont = font == nil ? UIFont.systemFont(ofSize: UIFont.systemFontSize) : font!
textContainerInset.top = (frame.height - iFont.lineHeight) / 2
}
textContainerInset worked for me instead of contentOffset.
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)
textContainerInset.top = positiveTopOffset
}
}