Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to adjust the height of a textview to his content in SWIFT?

Tags:

In my view controller, I have an UITextView. This textview is filled with a string. The string can be short or long. Depending on the length of the string, the height of the textview has to adjust. I use storyboards and auto layout.

I have some troubles with the height of the textview.

Sometimes, the height is perfectly adjusted to the text. Sometimes, no, the text is cropped on the first line. Below, the textview is yellow. the blue is a containerview inside a scrollview. Purple is the place for a picture.

title1title2

The texts are from my core data base, they are string attributes. Between the screen 1 and 2, the only thing changed is the string.
If I print the strings in the console I have the correct texts :

my amazing new title  Another funny title for demo 

The constraints of my textview :

enter image description here

I don't understand why I have 2 different displays.

EDIT

I tried the @Nate advice, in viewDidLoad, I added:

    myTextViewTitle.text="my amazing new title"      myTextViewTitle.setContentHuggingPriority(1000, forAxis: UILayoutConstraintAxis.Vertical)     myTextViewTitle.setContentCompressionResistancePriority(1000, forAxis: UILayoutConstraintAxis.Vertical)     myTextViewTitle.setTranslatesAutoresizingMaskIntoConstraints(false)        let views = ["new_view": myTextViewTitle]     var constrs = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[new_view]-8-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)     self.view.addConstraints(constrs)     self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[new_view]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))     self.myTextViewTitle.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[new_view(220@300)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 

No results. With or without height contraint added for my textview in interface builder...

EDIT 2

I need an UITextView and not an UIlabel, because of the back button, to use an exclusion path.

     let exclusionPathBack:UIBezierPath = UIBezierPath(rect: CGRect(x:backButton.bounds.origin.x, y:backButton.bounds.origin.y, width:backButton.bounds.width+10, height:backButton.bounds.height))      myTextViewTitle.textContainer.exclusionPaths=[exclusionPathBack] 
like image 945
cmii Avatar asked Apr 03 '15 12:04

cmii


People also ask

How do I size a UITextView to its content?

It can be done using the UITextView contentSize . This will not work if auto layout is ON. With auto layout, the general approach is to use the sizeThatFits method and update the constant value on a height constraint. CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.

How do I increase the height of a TextField in Swift?

Step 1 : Click the Attribute Inspector, Select the Border Styles which is not the rounded one. Step 2 : Now go to Size Inspector and change the size of the TextField. Step 3 : Create an @IBOutlet for TextField and then add below code inside the viewWillAppear() or viewDidAppear() .


2 Answers

I found a solution.

I was focus on the height of my UITextView, then I read a post talking about the aspect ratio. I wanted to try and that worked!

So in the storyboard, I added an aspect ratio for the textview, and I checked "Remove at build time" option.

In viewDidLayoutSubviews(), I wrote :

override func viewDidLayoutSubviews() {      super.viewDidLayoutSubviews()      let contentSize = self.myTextViewTitle.sizeThatFits(self.myTextViewTitle.bounds.size)     var frame = self.myTextViewTitle.frame     frame.size.height = contentSize.height     self.myTextViewTitle.frame = frame      aspectRatioTextViewConstraint = NSLayoutConstraint(item: self.myTextViewTitle, attribute: .Height, relatedBy: .Equal, toItem: self.myTextViewTitle, attribute: .Width, multiplier: myTextViewTitle.bounds.height/myTextViewTitle.bounds.width, constant: 1)     self.myTextViewTitle.addConstraint(aspectRatioTextViewConstraint!)  } 

It works perfectly.

like image 180
cmii Avatar answered Sep 18 '22 10:09

cmii


First, disable UITextView's scrollable. Two options:

  1. uncheck Scrolling Enabled in .xib.
  2. [TextView setScrollEnabled:NO];

Create a UITextView and connect it with IBOutlet (TextView). Add a UITextView height constraint with default height, connect it with IBOutlet (TextViewHeightConstraint). When you set your UITextView’s text asynchronously you should calculate the height of UITextView and set UITextView’s height constraint to it. Sample code:

CGSize sizeThatFitsTextView = [TextView sizeThatFits:CGSizeMake(TextView.frame.size.width, MAXFLOAT)];  TextViewHeightConstraint.constant = sizeThatFitsTextView.height;  
like image 38
Сергей Билык Avatar answered Sep 21 '22 10:09

Сергей Билык