Ich möchte meine Gedanken hinzufügen, da ich genau das gleiche Problem hatte.
Ich habe es verwendet, UITextView
da es eine schönere Textausrichtung hatte (begründen, was zu diesem Zeitpunkt nicht verfügbar war UILabel
), aber um nicht interaktiv-nicht scrollbar zu "simulieren" UILabel
, habe ich das vollständige Scrollen, Bouncen und die Benutzerinteraktion deaktiviert .
Das Problem war natürlich, dass der Text dynamisch war und die Breite zwar festgelegt wurde, die Höhe jedoch jedes Mal neu berechnet werden sollte, wenn ich einen neuen Textwert festlegte.
boundingRectWithSize
Es funktionierte überhaupt nicht gut für mich, soweit ich sehen konnte, UITextView
fügte ich oben einen Rand hinzu, der boundingRectWithSize
nicht gezählt werden konnte. Daher war die Höhe, aus der abgerufen boundingRectWithSize
wurde, kleiner als sie sein sollte.
Da der Text nicht schnell aktualisiert werden sollte, sondern nur für einige Informationen verwendet wird, die möglicherweise alle 2-3 Sekunden am häufigsten aktualisiert werden, habe ich mich für folgenden Ansatz entschieden:
/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
CGFloat msgWidth = tv.frame.size.width; // get target's width
// Make "test" UITextView to calculate correct size
UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
// Set all font and text related parameters to be exact as the ones in targeted text view
[temp setFont:tv.font];
[temp setTextAlignment:tv.textAlignment];
[temp setTextColor:tv.textColor];
[temp setText:text];
// Ask for size that fits :P
CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];
// kill this "test" UITextView, it's purpose is over
[temp release];
temp = nil;
// apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}
* Der obige Code wird nicht direkt von meiner Quelle kopiert, ich musste ihn anpassen / aus einer Reihe anderer Dinge entfernen, die für diesen Artikel nicht benötigt werden. Nehmen Sie es nicht für Copy-Paste-and-It-Will-Work-Code.
Offensichtlicher Nachteil ist, dass es für jeden Anruf eine Zuweisung und Freigabe hat.
Aber Vorteil ist , dass Sie vermeiden , je nach Kompatibilität zwischen dem, wie boundingRectWithSize zieht Text und berechnet seine Größe und Umsetzung von Text in Zeichnung UITextView
(oder UILabel
die auch können Sie verwenden , ersetzen Sie einfach UITextView
mit UILabel
). Alle "Fehler", die Apple möglicherweise hat, werden auf diese Weise vermieden.
PS Es scheint, dass Sie diese "Temperatur" nicht brauchen sollten UITextView
und einfach sizeThatFits
direkt vom Ziel fragen können, aber das hat bei mir nicht funktioniert. Obwohl die Logik sagen würde, dass es funktionieren sollte und die Zuweisung / Freigabe von temporären UITextView
nicht erforderlich ist, war dies nicht der Fall . Aber diese Lösung funktionierte einwandfrei für jeden Text, den ich einfügen würde.
lineBreakMode
?