2013-10-05 9 views

Antwort

17

Ich fand eine Lösung, von der ich denke, dass sie anderen helfen könnte. Da die Erstellung eines neuen NSTextContainer-, NSLayoutManager- und NSTextStorage-Objekts, das bereits als Teil von UITextView instanziiert ist, nicht erforderlich ist, vermute ich, dass es effizienter wäre.

Um die Größe eines UITextView zu berechnen, die Ausschlüsse Pfade und NSAttributedString verwendet, kann man folgendes tun:

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

mit textContainer und layoutManager Eigentlich brauchen Sie nicht zu spielen. Das funktioniert für mich.

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

Fast perfekt arbeiten. Ich musste +1 zur Höhe hinzufügen, um richtig zu arbeiten, weiß nicht warum :) –

Verwandte Themen