使用排除path计算TextView的单元格高度

如果我有一个UITableViewCell排除path的TextView,我如何计算给定string的单元格的高度?

我发现了一个我认为可能对别人有帮助的解决scheme。 由于它不需要创build一个新的NSTextContainer,NSLayoutManager和NSTextStorage对象,这些对象已经作为UITextView的一部分被实例化了,所以我怀疑它会更有效率。

要计算使用排除path和NSAttributedString的UITextView的大小,可以执行以下操作:

 // 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文档

其实你不需要使用textContainerlayoutManager 。 这对我有用。

 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;