Gibt es eine gute Möglichkeit, die Größe von a UITextView
an den Inhalt anzupassen? Angenommen, ich habe eine UITextView
, die eine Textzeile enthält:
"Hello world"
Ich füge dann eine weitere Textzeile hinzu:
"Goodbye world"
Gibt es in Cocoa Touch eine gute Möglichkeit rect
, alle Zeilen in der Textansicht zu speichern, damit ich die übergeordnete Ansicht entsprechend anpassen kann?
Sehen Sie sich als weiteres Beispiel das Notizfeld für Ereignisse in der Kalenderanwendung an. Beachten Sie, wie die Zelle (und die UITextView
darin enthaltenen) erweitert wird, um alle Textzeilen in der Zeichenfolge der Notizen aufzunehmen.
Antworten:
Dies funktioniert sowohl für iOS 6.1 als auch für iOS 7:
Oder in Swift (funktioniert mit Swift 4.1 in iOS 11)
Wenn Sie Unterstützung für iOS 6.1 wünschen, sollten Sie auch:
quelle
textview.scrollEnabled = NO;
, um zu verhindern, dass der Text auch in iOS 7 abgeschnitten wird.CGFLOAT_MAX
Makro anstelle von zu verwendenMAXFLOAT
. Richtig auf beiden 32/64-Bit-Plattformen.Dies funktioniert nicht mehr unter iOS 7 oder höher
Es gibt tatsächlich eine sehr einfache Möglichkeit, die
UITextView
Größe des Inhalts auf die richtige Höhe des Inhalts zu ändern . Dies kann mit dem erfolgenUITextView
contentSize
.Zu beachten ist, dass das Richtige
contentSize
erst verfügbar ist, nachdem dasUITextView
der Ansicht mit hinzugefügt wurdeaddSubview
. Vorher ist es gleichframe.size
Dies funktioniert nicht, wenn das automatische Layout aktiviert ist. Beim automatischen Layout besteht der allgemeine Ansatz darin, die
sizeThatFits
Methode zu verwenden und denconstant
Wert für eine Höhenbeschränkung zu aktualisieren .heightConstraint
ist eine Layoutbeschränkung, die Sie normalerweise über ein IBOutlet einrichten, indem Sie die Eigenschaft mit der in einem Storyboard erstellten Höhenbeschränkung verknüpfen.Nur um diese erstaunliche Antwort, 2014, hinzuzufügen, wenn Sie:
Es gibt nur beim iPhone6 + einen Unterschied im Verhalten :
Nur mit 6+ (nicht mit 5s oder 6) wird der UITextView "eine weitere Leerzeile" hinzugefügt. Die "RL-Lösung" behebt dies perfekt:
Es behebt das Problem der "zusätzlichen Leitung" bei 6+.
quelle
layoutIfNeeded
die Übersicht auf. Dann können Sie die Höhe von greifencontentSize
.Um eine dynamische Größe
UITextView
innerhalb von a zu erstellenUITableViewCell
, habe ich festgestellt, dass die folgende Kombination in Xcode 6 mit dem iOS 8 SDK funktioniert:UITextView
zu a hinzuUITableViewCell
und beschränken Sie es auf die SeitenUITextView
‚s -scrollEnabled
Eigenschaft aufNO
. Wenn das Scrollen aktiviert ist, ist der Frame vonUITextView
unabhängig von seiner Inhaltsgröße, aber wenn das Scrollen deaktiviert ist, besteht eine Beziehung zwischen beiden.Wenn Ihre Tabelle die ursprüngliche Standardzeilenhöhe von 44 verwendet, werden automatisch die Zeilenhöhen berechnet. Wenn Sie jedoch die Standardzeilenhöhe in etwas anderes geändert haben, müssen Sie möglicherweise die automatische Berechnung der Zeilenhöhen manuell aktivieren in
viewDidLoad
:Für schreibgeschützte dynamische Größen von
UITextView
s ist es das. Wenn Sie Benutzern erlauben, den Text in Ihrem zu bearbeitenUITextView
, müssen Sie außerdem:Implementieren Sie die
textViewDidChange:
Methode desUITextViewDelegate
Protokolls und weisen Sie dastableView
an, sich jedes Mal neu zu malen, wenn der Text bearbeitet wird:Und vergessen Sie nicht, den
UITextView
Delegierten irgendwo inStoryboard
oder in zu setzentableView:cellForRowAtIndexPath:
quelle
tableView.rowHeight = UITableViewAutomaticDimension
unnötig.Sehr einfach zu arbeitende Lösung mit Code und Storyboard.
Nach Code
Mit dem Storyboard
Deaktivieren Sie das Scrolling aktivieren
Sie müssen nichts anderes tun.
quelle
Swift:
quelle
textView.scrollEnabled = false
Nach meiner (begrenzten) Erfahrung
respektiert keine Zeilenumbrüche, so dass Sie am Ende viel kürzer sein können,
CGSize
als tatsächlich erforderlich ist.scheint die Zeilenumbrüche zu respektieren.
Außerdem wird der Text nicht oben im Bild gerendert
UITextView
. In meinem Code habe ich die neue Höhe vonUITextView
24 Pixel größer als die von densizeOfFont
Methoden zurückgegebene Höhe festgelegt.quelle
In iOS6 können Sie die
contentSize
Eigenschaft von UITextView direkt nach dem Festlegen des Texts überprüfen . In iOS7 funktioniert dies nicht mehr. Wenn Sie dieses Verhalten für iOS7 wiederherstellen möchten, platzieren Sie den folgenden Code in einer Unterklasse von UITextView.quelle
Ich werde die richtige Lösung am Ende der Seite veröffentlichen, falls jemand mutig (oder verzweifelt genug) ist, bis zu diesem Punkt zu lesen.
Hier ist gitHub Repo für diejenigen, die den ganzen Text nicht lesen möchten: resizableTextView
Dies funktioniert mit iOs7 (und ich glaube, es wird mit iOs8 funktionieren) und mit Autolayout. Sie brauchen keine magischen Zahlen, deaktivieren das Layout und ähnliches. Kurze und elegante Lösung.
Ich denke, dass der gesamte Code, der sich auf Einschränkungen bezieht, zur
updateConstraints
Methode gehen sollte . Also, machen wir unsere eigenenResizableTextView
.Das erste Problem, auf das wir hier stoßen, ist, dass wir die tatsächliche Größe des Inhalts vor der
viewDidLoad
Methode nicht kennen . Wir können einen langen und fehlerhaften Weg nehmen und ihn basierend auf Schriftgröße, Zeilenumbrüchen usw. berechnen. Aber wir brauchen eine robuste Lösung, also tun wir Folgendes:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Jetzt kennen wir also echte ContentSize, egal wo wir sind: vorher oder nachher
viewDidLoad
. Fügen Sie nun textView eine Höhenbeschränkung hinzu (über Storyboard oder Code, egal wie). Wir werden diesen Wert mit unserem anpassencontentSize.height
:Das Letzte, was zu tun ist, ist, Superklasse zu sagen
updateConstraints
.Jetzt sieht unsere Klasse so aus:
ResizableTextView.m
Schön und sauber, oder? Und Sie müssen sich nicht mit diesem Code in Ihren Controllern befassen !
Aber warte! Y KEINE ANIMATION!
Sie können Änderungen leicht animieren, um die
textView
Dehnung reibungslos zu gestalten. Hier ist ein Beispiel:quelle
CGFLOAT_MAX
nichtFLT_MAX
.Hast du versucht
[textView sizeThatFits:textView.bounds]
?Bearbeiten: sizeThatFits gibt die Größe zurück, ändert jedoch nicht die Größe der Komponente. Ich bin mir nicht sicher, ob Sie das wollen oder ob
[textView sizeToFit]
es mehr ist, wonach Sie gesucht haben. In beiden Fällen weiß ich nicht, ob es perfekt zum gewünschten Inhalt passt, aber es ist das erste, was Sie versuchen sollten.quelle
Eine andere Methode ist das Finden der Größe, die eine bestimmte Zeichenfolge mit der
NSString
Methode annehmen wird:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
Dies gibt die Größe des Rechtecks zurück, das der angegebenen Zeichenfolge mit der angegebenen Schriftart entspricht. Übergeben Sie eine Größe mit der gewünschten Breite und einer maximalen Höhe. Anschließend können Sie die zurückgegebene Höhe anzeigen, um sie an den Text anzupassen. Es gibt eine Version, mit der Sie auch den Zeilenumbruchmodus festlegen können.
Sie können dann die zurückgegebene Größe verwenden, um die Größe Ihrer Ansicht anzupassen.
quelle
Wenn Sie nicht über die
UITextView
praktischen Funktionen verfügen (z. B. die Größe von Zellen in der Tabellenansicht), müssen Sie die Größe berechnen, indem Sie die Zeichenfolge messen und dann die 8-Punkt-Polsterung auf jeder Seite von a berücksichtigenUITextView
. Wenn Sie beispielsweise die gewünschte Breite Ihrer Textansicht kennen und die entsprechende Höhe ermitteln möchten:Hier macht jede 8 eine der vier gepolsterten Kanten aus, und 100000 dient nur als sehr große maximale Größe.
In der Praxis möchten Sie möglicherweise ein zusätzliches Element
font.leading
zur Höhe hinzufügen . Dies fügt eine leere Zeile unter Ihrem Text hinzu, die möglicherweise besser aussieht, wenn sich direkt unter der Textansicht visuell starke Steuerelemente befinden.quelle
Wir können es durch Einschränkungen tun.
2.Erstellen Sie das IBOutlet für diese Höhenbeschränkung.
3. Vergessen Sie nicht, den Delegaten für Ihre Textansicht festzulegen.
4.
dann aktualisiere deine Einschränkung so :)
quelle
Folgende Dinge reichen aus:
UITextView
:Sie können sogar verwenden
UITableViewAutomaticDimension
.quelle
In Kombination mit der Antwort von Mike McMaster möchten Sie vielleicht Folgendes tun:
quelle
Ich habe eine Möglichkeit gefunden, die Höhe eines Textfelds entsprechend dem darin enthaltenen Text zu ändern und auch eine Beschriftung darunter basierend auf der Höhe des Textfelds anzuordnen! Hier ist der Code.
quelle
Leute, die Autolayout verwenden und deren Größe nicht funktioniert, überprüfen Sie bitte einmal Ihre Breitenbeschränkung. Wenn Sie die Breitenbeschränkung übersehen haben, ist die Höhe genau.
Sie müssen keine andere API verwenden. Nur eine Zeile würde das ganze Problem beheben.
Hier ging es mir nur um die Höhe, um die Breite fest zu halten und um die Breitenbeschränkung meiner TextView im Storyboard zu übersehen.
Und dies sollte den dynamischen Inhalt der Dienste anzeigen.
Hoffe das könnte helfen ..
quelle
Ab iOS 8 ist es möglich, die automatischen Layoutfunktionen einer UITableView zu verwenden, um die Größe einer UITextView ohne benutzerdefinierten Code automatisch zu ändern. Ich habe ein Projekt in Github gestellt , das dies in Aktion demonstriert, aber hier ist der Schlüssel:
rowHeight
zuUITableViewAutomaticDimension
.quelle
Ich habe alle Antworten überprüft und alle behalten die feste Breite bei und passen nur die Höhe an. Wenn Sie auch die Breite anpassen möchten, können Sie diese Methode ganz einfach verwenden:
Wenn Sie Ihre Textansicht konfigurieren, deaktivieren Sie den Bildlauf
und
func textViewDidChange(_ textView: UITextView)
fügen Sie dann in der Delegate-Methode diesen Code hinzu:Ausgänge:
quelle
Dies funktionierte gut, wenn ich Text in a machen musste
UITextView
einem bestimmten Bereich anpassen musste:quelle
Hier ist die schnelle Version von @jhibberd
quelle
Scrollen deaktivieren
füge Konstanten hinzu
und fügen Sie Ihren Text hinzu
Wenn Sie verwenden
UIScrollView
, sollten Sie dies auch hinzufügen.quelle
Für iOS 7.0 wird anstelle der Einstellung
frame.size.height
diecontentSize.height
(die derzeit nichts tut) verwendet[textView sizeToFit]
.Siehe diese Frage .
quelle
Die Verwendung von UITextViewDelegate ist der einfachste Weg:
quelle
Hoffe das hilft:
quelle
textView.frame
.Wenn andere hierher kommen, funktioniert diese Lösung für mich, 1 "Ronnie Liew" +4 "user63934" (Mein Text kommt vom Webdienst): Beachten Sie die 1000 (nichts kann "in meinem Fall" so groß sein)
Und das ist ... Prost
quelle
Der beste Weg, den ich gefunden habe, um die Höhe der UITextView entsprechend der Größe des Textes zu ändern.
oder Sie können verwenden
quelle
Für diejenigen, die möchten, dass die Textansicht tatsächlich nach oben verschoben wird und die Position der unteren Zeile beibehalten wird
quelle
Der einzige Code, der funktioniert, ist der, der 'SizeToFit' wie in der obigen Antwort von jhibberd verwendet, aber tatsächlich nicht aufgenommen wird, es sei denn, Sie rufen ihn in ViewDidAppear auf oder verbinden ihn mit dem Textänderungsereignis UITextView.
quelle
Basierend auf der Antwort von Nikita Took kam ich in Swift zu der folgenden Lösung, die unter iOS 8 mit Autolayout funktioniert:
quelle
Schnelle Antwort: Der folgende Code berechnet die Höhe Ihrer Textansicht.
Jetzt können Sie die Höhe Ihrer Textansicht auf einstellen
myTextHeight
quelle
let attribute = [NSFontAttributeName: textView.text.font!]
Ist das wirklich Swift-Code ohne Fehler?)let attribute = [NSFontAttributeName: textView.font!]