I have been messing with these constraints for hours and cannot figure this out. I need to have Dynamic cell height with my text view.
As you can see its o
For Swift 3.1, 4.0
It will be achieved by setting constraints and UITableViewAutomaticDimensions
.
Step 1:
Step 2:
Step 3:
Step 4:
Remove Scrolling for UITextView
Step 5:
Add Below code,
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
Note:
If you have UILabel
then, Replace UITextView
to UILabel
from above solution and label.numberOfLines = 0
.
Output:
User vertical spacing between the timeStamp and the message, and set the constant to >=2
If your cell height is dependent on text size then follow this: Add the method in your ViewController.swift
func calculateHeight(inString:String) -> CGFloat {
let messageString = inString
let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 15.0)]
let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)
let rect : CGRect = attributedString.boundingRect(with: CGSize(width: 222.0, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)
let requredSize:CGRect = rect
return requredSize.height
}
Set the width of your text label Then call this function:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
heightOfRow = self.calculateHeight(inString: conversations[indexPath.row].description)
return (heightOfRow + 60.0)
}
For Basic cell:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
This function will not work for custom cells.
If your cell height is dependent on image height, then return image height + someFloatValueAccordingToYourChoice.
Hope it will work.