2013-10-05 8 views

答えて

17

私は他人に助けになると思われる解決策を見つけました。すでにUITextViewの一部としてインスタンス化されている新しいNSTextContainer、NSLayoutManager、およびNSTextStorageオブジェクトの作成を必要としないので、より効率的であると思われます。

は除外パスと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 Documentation

3

は実際にあなたが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; 
+0

ほぼ完全に動作します。私は正しく動作するように、高さに+1を加えなければならなかった、理由を知らない:) –

関連する問題