Mit dem folgenden Code können Sie die Höhe Ihres UITextView abhängig von einer festen Breite ändern (es funktioniert unter iOS 7 und der vorherigen Version):
- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width
{
UITextView *textView = [[UITextView alloc] init];
[textView setAttributedText:text];
CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)];
return size.height;
}
Mit dieser Funktion nehmen Sie einen NSAttributedString und eine feste Breite, um die benötigte Höhe zurückzugeben.
Wenn Sie den Rahmen aus einem Text mit einer bestimmten Schriftart berechnen möchten, müssen Sie den folgenden Code verwenden:
- (CGSize)text:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
CGRect frame = [text boundingRectWithSize:size
options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName:font}
context:nil];
return frame.size;
}
else
{
return [text sizeWithFont:font constrainedToSize:size];
}
}
Sie können dies SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO
in Ihrer prefix.pch-Datei in Ihrem Projekt wie folgt hinzufügen :
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Sie können den vorherigen Test auch ersetzen SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)
durch:
if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])
NSStringDrawingUsesFontLeading
ist extraDies funktionierte für mich für iOS6 und 7:
CGSize textViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)]; self.myTextView.height = textViewSize.height;
quelle
textView.bounds.size.height
Verwendet in iOS7
UITextView
dasNSLayoutManager
Layout von Text:// If YES, then the layout manager may perform glyph generation and layout for a given portion of the text, without having glyphs or layout for preceding portions. The default is NO. Turning this setting on will significantly alter which portions of the text will have glyph generation or layout performed when a given generation-causing method is invoked. It also gives significant performance benefits, especially for large documents. @property(NS_NONATOMIC_IOSONLY) BOOL allowsNonContiguousLayout;
deaktivieren
allowsNonContiguousLayout
, um zu behebencontentSize
:textView.layoutManager.allowsNonContiguousLayout = NO;
quelle
Verwenden Sie diese kleine Funktion
-(CGSize) getContentSize:(UITextView*) myTextView{ return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)]; }
quelle
Meine endgültige Lösung basiert auf HotJards, enthält jedoch sowohl die oberen als auch die unteren Einfügungen des Textcontainers, anstatt 2 * fabs (textView.contentInset.top) zu verwenden:
- (CGFloat)textViewHeight:(UITextView *)textView { return ceilf([textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height + textView.textContainerInset.top + textView.textContainerInset.bottom); }
quelle
Mit dieser Methode gibt es einfachere Lösungen:
+(void)adjustTextViewHeightToContent:(UITextView *)textView; { if([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f){ textView.height = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height+2*fabs(textView.contentInset.top); }else{ textView.height = textView.contentSize.height; } }
UPD : funktioniert nur zum Anzeigen von Text (isEditable = NO)
quelle
usedRectForTextContainer
wird dieselbe Höhe zurückgegeben._textView.textContainerInset = UIEdgeInsetsZero; _textView.textContainer.lineFragmentPadding = 0;
Vergessen Sie nur nicht das lineFragmentPadding
quelle
einfache Lösung -
textView.isScrollEnabled = false
funktioniert perfekt, wenn Sie sich in einer anderen Bildlaufansicht oder in einer tableView-Zelle befindenUITableViewAutomaticDimension
quelle
@ Anas, @Blake Hamilton-Lösung in swift .
var contentHeight: CGFloat = textView.sizeThatFits(textView.frame.size).height
Das Gute für mich war, dass dies auch das Richtige zurückgibt
contentSize
, wennisScrollEnable
auf false gesetzt ist. Bei der Einstellung false wurde die Rahmengröße der Textansicht anstelle der Inhaltsgröße zurückgegeben.quelle