0
votes

I have a table view and cell created in interface builder.

I've configured:

    tableView.estimatedRowHeight = 140
    tableView.rowHeight = UITableViewAutomaticDimension

It does work when I set up the cell in cellForRowAt right away:

let text = NSAttributedString(string: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?")
cell.detail.attributedText = text

But how can we move the heavy lifting to a background task so we have a butter smooth scroll?

If I change the previous code to this:

            DispatchQueue.global().async {
                let text = NSAttributedString(string: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?")
                DispatchQueue.main.async {
                    cell.detail.attributedText = text
                }
            }

Then the self-sizing doesn't work anymore. I think I've tried every single method after updating the text, like setNeedsLayout.

1
subclass UITableViewCell, and stop using Swift, stick with Objective-C. when you subclass the Cell then make a method + (CGFloat)heightForCellWithText:(NSString *)text availableWidth:(CGFloat)availableWidth in the sub class cell that calls boundingRectWithSize using the NSSString from the NSAttributedString, use this method in the height delegte of the UIViewController that contains the table or collection view - Larry Pickles

1 Answers

0
votes

Well it turned out that the most efficient way is to calculate/cache the attributed string and when that job done simply reload the cell !