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:
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() 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 } } Add this code as extension.
extension UITextView { // This function centers the textview text to vertically center of the container func centerVertically() { let myFont = font == nil ? UIFont.systemFont(ofSize: UIFont.systemFontSize) : font! textContainerInset.top = (frame.height - myFont.lineHeight) / 2 } } then in you view controller use it as:
myText.centerVertically() The above should work for you for UITextview. And if not then you can use UILabel instead of UITextview to center the text vertically.
You can still use the same NSAttributedString to center the text horizontally. UILabel centers the text vertically by default, but you have to set the number of lines to make it show several lines. If you set it to 0, it will be as large as it needs to be:
myView.numberOfLines = 0