Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 428 Vote(s) - 3.55 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How do I tell my UITableViewCell to "auto-resize" when its content changes?

#1
In my cell.xib, I have a label, with constraints to all its sides. I've set that label to ```lines = 0``` and ```line-break = word wrap```. Then, I do this to my TableView:

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100.0

Everything works great, and my UITableViewCell is auto-height. If the text is long, then my tableView intelligently calculates the size.

The problem is -- how do I tell my UITableView to "re-calculate" the size once the content changes in the cell?

My cell could call its delegate, and in this delegate, I'd like the TableView to re-draw the height.

Right now, the content in my cells change constantly, but the cell height never changes.
Reply

#2
To disable the annoying `tableView` animation:

```Swift
UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
// cell.titleLabel?.text = "title"
// cell.detailTextLabel?.text = "Very long text ..."
// cell.detailTextLabel?.numberOfLines = 0
tableView.endUpdates()
UIView.setAnimationsEnabled(true)
```
Reply

#3
Take a look at this answer :

[To see links please register here]


How to achieve dynamic cell size is described very thorough there.

As a suggestion for testing try adding setNeedsLayout to:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

or

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
Reply

#4
You can get automatic cell height by this code

tableView.beginUpdates()
// add label text update code here
// label.numberOfLines = label.numberOfLines == 0 ? 1 : 0
tableView.endUpdates()

Below is the reference to this solution with demo :

[GitHub-RayFix-MultiLineDemo](

[To see links please register here]

)
Reply

#5
There is a documented way to do this. See `UITableView.beginUpdates()` [documentation][1]:

> You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.

So, the correct solution is:

tableView.beginUpdates()
tableView.endUpdates()

Also note that there is a feature that is not documented - you can add a completion handler for the update animation here, too:

tableView.beginUpdates()
CATransaction.setCompletionBlock {
// this will be called when the update animation ends
}

tableView.endUpdates()

However, tread lightly, it's not documented (but it works because `UITableView` uses a `CATransaction` for the animation).

[1]:

[To see links please register here]

Reply

#6
Seems you wanted to reload the particular cell/cells based on content changes

Here we have a couple of options

1) Need to reload the entire table view .

or else

2) Reload particular cell/cells based on content changes.

But the preferred option would be reloading the particular cell,

Why because
when you asked your UITableView instance to reload a couple of cells,tableview will asks its datasource(-tableView:cellForRowAtIndexPath:) to get the updated content,so that the reloaded cells will have the updated size & Updated content aswell.

Try to reload the cells when the content/height need to update based on content

Hope that helps!
Happy coding :)


Reply

#7
I got your point, and I met the problem before.
Your cell is in AutoLayout, and you wish the cell changes by itself. Here is recommended answer for that:

[To see links please register here]

, so we don't talk about that again.

So here we focus on your problem.

Since the content of your cell changes constantly, which means the content has updated. Here we suppose the content is a label. We set the label's text, and surely the label's height maybe change.

###Here comes the point: How does the label's change inform the cell to update?

We use **AutoLayout**, surely we have to **update the constraint of height for the label.**

And I think it will work!

Below is the detail step:
1. We setup the constraints for the cell's subviews.(I think it's done)
2. One of the label's height is changed by itself.(I think it's done too)
3. We get the new height of the label, and update the constraint of height for the label.(what we have to do)

Reply

#8
You can resize your cell height by implementing below method only

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
Reply

#9
I've found the best way to get it to check heights is to call, after whatever text change has been made, in order:

self.tableView.beginUpdates()
self.tableView.endUpdates()

This causes the tableView to check heights for all visible cells and it will cause changes to be made as needed.
Reply

#10
I think the simplest solution is to reload that specific cell. For example:

- (void)yourDelegateMethodOfCell:(UITableViewCell *)cell {
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
//If cell is not visible then indexPath will be nil so,
if (indexPath) {
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through