Reputation: 301
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 overlapping my time stamp. As of right now I have zero(no) constraints on the time stamp. I have tried every combination possible to make this work and I cant get it.
Also am using
override func viewDidLoad() {
super.viewDidLoad()
//TableView Cell word wrap (Dynamic Text)
self.tableView.dataSource = self
self.tableView.delegate = self
self.tableView.estimatedRowHeight = 78
self.tableView.rowHeight = UITableViewAutomaticDimension
Upvotes: 0
Views: 3056
Reputation: 7269
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:
Upvotes: 6
Reputation: 4127
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.
Upvotes: 1
Reputation: 141
User vertical spacing between the timeStamp and the message, and set the constant to >=2
Upvotes: 0