Calculate cell height for TextView with exception paths

If I have a TextView with an exception path in a UITableViewCell , how can I calculate cell height for a given row?

+7
ios height uitableview uitextview textkit
source share
2 answers

I found a solution that I think could help others. Since it does not require the creation of a new NSTextContainer, NSLayoutManager, or NSTextStorage, which are already created as part of the UITextView, I suspect that it would be more efficient.

To calculate the size of a UITextView using exception paths and NSAttributedString, you can do the following:

 // Assuming something like this... UIBezierPath * exclusionPath = [UIBezierPath bezierPathWithRect:someRect]; self.textView.textContainer.exclusionPaths = @[exclusionPath]; NSAttributedString * attributedString = ... self.textView.attributedString = attributedString; ... // Use text container, layout manager, and text storage associated with the text view. NSTextContainer * textContainer = self.textView.textContainer; NSLayoutManager * layoutManager = textContainer.layoutManager; NSTextStorage * textStorage = layoutManager.textStorage; // Limit the width or height. In this case, limiting the width to 280. textContainer.size = CGSizeMake(280.0, FLT_MAX); [textStorage setAttributedString:attributedString]; // Because the layout manager performs layout lazily, on demand, you must force it to lay out the text, even though you don't need the glyph range returned by this function. [layoutManager glyphRangeForTextContainer:textContainer]; // Ask the layout manager for the height of the rectangle occupied by the laid-out text CGFloat height = [layoutManager usedRectForTextContainer:textContainer].size.height; 

Apple Documentation

+17
source share

In fact, you do not need to play with textContainer and layoutManager . This works for me.

 UIBezierPath *exclusionPath = [UIBezierPath bezierPathWithRect:imageViewFrame]; UITextView *tempTextView = [[UITextView alloc] init]; [tempTextView setFont:font]; tempTextView.textContainer.exclusionPaths = @[exclusionPath]; [tempTextView.textStorage replaceCharactersInRange:NSMakeRange(0, [tempTextView.text length]) withString:text]; CGRect textViewFrame = [tempTextView frame]; textViewFrame.size.height = [tempTextView sizeThatFits:CGSizeMake(290, FLT_MAX)].height; return textViewFrame.size.height; 
+3
source share

All Articles