565 Stimmen

Wie kann ich die Größe einer UITextView an den Inhalt anpassen?

Gibt es eine gute Möglichkeit, die Größe einer UITextView mit ihrem Inhalt übereinstimmen? Sagen wir, ich habe zum Beispiel eine UITextView die eine Textzeile enthält:

"Hello world"

Dann füge ich eine weitere Textzeile hinzu:

"Goodbye world"

Gibt es eine gute Möglichkeit in Cocoa Touch, die rect die alle Zeilen in der Textansicht enthält, so dass ich die übergeordnete Ansicht entsprechend anpassen kann?

Ein weiteres Beispiel ist das Feld "Notizen" für Ereignisse in der Kalenderanwendung - beachten Sie, wie die Zelle (und die UITextView enthält) wird erweitert, um alle Textzeilen der Notenzeichenfolge aufzunehmen.

0 Stimmen

Bitte aktualisieren Sie die korrekte Antwort, da die akzeptierte Antwort zu unnötigen Berechnungen führt; jetzt gibt es eine contentSize-Eigenschaft für dieses Problem.

0 Stimmen

Warum gibt es keine Fragen dazu, wie man das nicht dynamisch machen kann? Ich kann nicht einmal herausfinden, wie man es statisch macht. Und die bereitgestellten Lösungen scheinen nicht zu "Einschränkungen" in Storyboard außer Kraft setzen.

645voto

jhibberd Punkte 7416

Dies funktioniert sowohl für iOS 6.1 als auch für iOS 7:

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

Oder in Swift (funktioniert mit Swift 4.1 in iOS 11)

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

Wenn Sie Unterstützung für iOS 6.1 wünschen, sollten Sie dies ebenfalls tun:

textview.scrollEnabled = NO;

1 Stimmen

Getestet unter iOS 7, um die Größe einer UITextView in eine UITableViewCell zu ändern. Funktioniert wirklich großartig. Dies ist die einzige Antwort, die endlich für mich funktioniert. Danke!

41 Stimmen

Ich brauchte die textview.scrollEnabled = NO; um zu verhindern, dass der Text auch unter iOS 7 abgeschnitten wird.

19 Stimmen

Ich empfehle die Verwendung von CGFLOAT_MAX Makro anstelle von MAXFLOAT . Proper auf beiden 32/64-Bit-Plattformen.

578voto

Ronnie Liew Punkte 18100

Dies funktioniert nicht mehr unter iOS 7 oder höher

Es gibt tatsächlich eine sehr einfache Möglichkeit, die Größe der UITextView auf die richtige Höhe des Inhalts zu bringen. Dies kann mit dem Befehl UITextView contentSize .

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

Es ist zu beachten, dass die korrekte contentSize ist nur verfügbar après die UITextView wurde der Ansicht hinzugefügt mit addSubview . Davor ist sie gleich frame.size

Dies funktioniert nicht, wenn das automatische Layout eingeschaltet ist. Bei automatischem Layout ist der allgemeine Ansatz, die sizeThatFits Methode und aktualisieren Sie die constant Wert für eine Höhenbeschränkung.

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

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 zu ergänzen, 2014, wenn Sie:

[self.textView sizeToFit];

gibt es einen Unterschied im Verhalten mit dem iPhone6+ nur:

enter image description here

Nur beim 6+ (nicht beim 5s oder 6) wird der UITextView "eine weitere Leerzeile" hinzugefügt. Die "RL-Lösung" behebt dies perfekt:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

Es behebt das Problem der "zusätzlichen Zeile" auf 6+.

2 Stimmen

Du hast meinen Tag gerettet. Ich kämpfte mit der selbstberechnenden Klassenfunktionserweiterung und vergaß das hier. Vielen Dank!

0 Stimmen

@Ronnie, ich danke Ihnen für Ihren Code, ich habe Ihren Code verwenden, aber wenn mein textview Inhalt 2000 Zeile erreichen, machte dieser Code meine app immer langsam, können Sie mir sagen, warum?

0 Stimmen

@Ronnie , wo sollen wir diesen Code schreiben. Ich möchte zunächst eine Zeile des Rahmens anzeigen, und wenn der Benutzer den Rahmen eingibt, sollte er sich vergrößern, um den Text unterzubringen, ohne nach oben zu scrollen.

109voto

Alok Punkte 22844

Eine sehr einfach funktionierende Lösung, die sowohl Code als auch Storyboard verwendet.

Nach Code

textView.scrollEnabled = false

Nach Storyboard

Deaktivieren Sie das Kontrollkästchen Scrollen aktivieren

enter image description here

Es ist nicht nötig, etwas anderes zu tun.

5 Stimmen

Diese Antwort ist richtig. In StoryBoard haben Sie die TextView AutoSize genau wie ein UILabel. Alles, was wir tun müssen, ist scrollEnabled=false zu setzen.

4 Stimmen

Im Grunde ist das richtig: Wenn Sie Autolayout-Einschränkungen verwenden und das Scrollen abschalten, funktioniert das Ganze.

3 Stimmen

Herzlichen Dank. Es war so einfach, deaktivieren Sie einfach das Scrollen in Storyboard oder Code, es wird wie UILabel mit Zeilen 0 sein.

105voto

Brett Donald Punkte 3266

Update

Das Wichtigste, was Sie tun müssen, ist das Ausschalten des Bildlaufs in Ihrer UITextView.

myTextView.scrollEnabled = @NO

Original-Antwort

Um eine dynamisch skalierende UITextView innerhalb einer UITableViewCell Ich fand die folgende Kombination funktioniert in Xcode 6 mit dem iOS 8 SDK:

  • Hinzufügen einer UITextView à un UITableViewCell und beschränken Sie es auf die Seiten

  • Setzen Sie die UITextView 's scrollEnabled Eigenschaft zu NO . Wenn der Bildlauf aktiviert ist, wird der Rahmen der UITextView ist unabhängig von der Größe des Inhalts, aber wenn der Bildlauf deaktiviert ist, besteht eine Beziehung zwischen den beiden.

  • Wenn Ihre Tabelle die ursprüngliche Standardzeilenhöhe von 44 verwendet, werden die Zeilenhöhen automatisch berechnet. Wenn Sie die Standardzeilenhöhe jedoch auf etwas anderes geändert haben, müssen Sie die automatische Berechnung der Zeilenhöhen möglicherweise manuell in viewDidLoad :

     tableView.estimatedRowHeight = 150;
     tableView.rowHeight = UITableViewAutomaticDimension;

Für schreibgeschützte dynamische Größenanpassung UITextView s, das war's. Wenn Sie den Benutzern erlauben, den Text in Ihrem UITextView müssen Sie auch:

  • Umsetzung der textViewDidChange: Methode der UITextViewDelegate Protokoll, und sagen Sie dem tableView bei jeder Bearbeitung des Textes neu gezeichnet werden:

     - (void)textViewDidChange:(UITextView *)textView;
     {
         [tableView beginUpdates];
         [tableView endUpdates];
     }
  • Und vergessen Sie nicht, die Option UITextView irgendwo delegieren, entweder in Storyboard oder in tableView:cellForRowAtIndexPath:

0 Stimmen

Die beste Antwort für mich. Funktioniert perfekt und UITableViewAutomaticDimension wurde in iOS 5 hinzugefügt, so dass es rückwärtskompatibel ist.

4 Stimmen

Das hat bei mir nicht ganz geklappt. Die textViewDidChange-Methode verursachen meine tableview zu bounce jedes Mal, wenn ich ein Zeichen getippt. Was ich vorschlage, ist, dass anstelle der Verwendung dieser Methode, in der tableView : cellForRowAtIndexPath-Methode, für die Zeile mit dem textview auf sie, wenn Sie in einem nur-Lese-Modus eingestellt sind .scrollEnabled auf NO, und wenn Sie in einer Bearbeitungsansicht eingestellt scroll aktiviert auf YES. Auf diese Weise wird bei der Anzeige immer der gesamte Text angezeigt, und bei der Bearbeitung wird mit dem gesamten Text begonnen, und beim Hinzufügen von weiterem Text wird die gleiche Größe beibehalten, wobei der frühere Text nach oben scrollt.

3 Stimmen

Außerdem habe ich eine >= Höhenbeschränkung für die Textansicht hinzugefügt, da ein leeres Textfeld keine Höhe hat und nicht angetippt werden kann, um die Bearbeitung zu starten.

67voto

Juan Boero Punkte 5900

Mauersegler :

textView.sizeToFit()

14 Stimmen

Außerdem stellte ich fest, dass ich "Scrolling enabled" auf "false" setzen musste, damit dies funktioniert. textView.scrollEnabled = false

2 Stimmen

Sie sollten daran denken, textView.layoutIfNeeded() nach textView.sizeToFit() aufzurufen.

5 Stimmen

@tmarkiewicz Es funktioniert, wenn der Text auf den Bildschirm Ihres Geräts passt, aber es wird ein Problem sein, wenn Ihr Text größer ist als der Platz auf dem Bildschirm. Sie können dann nicht mehr scrollen, um den Rest des Textes zu sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X