32

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.

2
  • You have to be more specific do you want to do it from storyboard or from code and if you want from code what version of swift do you use? Commented Dec 29, 2016 at 21:54
  • I use Swift 3. It would be better if it was from storyboard but i couldn't see an option for that Commented Dec 29, 2016 at 21:57

9 Answers 9

62

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

Sign up to request clarification or add additional context in comments.

15 Comments

I want to center it 'vertically' in the container not 'horizontally'
@Volkan what do you mean vertically?
lets say i have a text for 2 lines only and my textview has a height for 200. I want to center that text vertically
this answer is good, just put that code in layoutsubviews of the superview or viewdidlayoutsubviews in the controller
But this answer doesn't support multiline well no?
|
5

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()

1 Comment

Thank you ! The accepted answer did not allow me to scroll the textView while yours did ( I just had to call it in layoutSubview and it was okay)
2

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

3 Comments

You can't put an UIView inside of UITextView.
Ahh this is really smart. He's saying put a textview (vertically aligned) inside a "parent" view.
This totally worked for me and was very easy to do. UNDERRATED ANSWER. I was would recommend having the "parent" view being a horizontal stack view, then set the alignment to "centered" so that the text view's height automatically adjusts to always keep it centered.
2

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() }

Comments

2

Swift 5

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() 

1 Comment

only this line worked for me self.textAlignment = .center
2

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 } 

Comments

0

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 } } 

Comments

0

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 

Comments

-1

This is used to center the text horizontal.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.