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.

9voto

Kishore Kumar Punkte 3959

Wir können es mit Zwängen tun.

  1. Höhenbeschränkungen für UITextView festlegen. enter image description here

2. ein IBOutlet für diese Höhenbeschränkung erstellen.

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3. Vergessen Sie nicht, einen Delegaten für Ihre Textansicht festzulegen.

4.

-(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);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

dann aktualisieren Sie Ihre Einschränkung wie folgt :)

0 Stimmen

Das ist ein FANTASTISCHER Spitzname!

1 Stimmen

Das Setzen der Konstante muss im Animationsblock von [textView layoutIfNeeded]; gefolgt werden. (Autolayout-Animationen machen das so.)

8voto

Becca Royal-Gordon Punkte 17031

Wenn Sie nicht über die UITextView praktisch ist (z. B. wenn Sie die Größe von Zellen in der Tabellenansicht anpassen), müssen Sie die Größe berechnen, indem Sie die Zeichenfolge messen und dann die 8 pt Füllung auf jeder Seite einer UITextView . Wenn Sie z. B. die gewünschte Breite Ihrer Textansicht kennen und die entsprechende Höhe herausfinden wollen:

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

Hier steht jede 8 für eine der vier gepolsterten Kanten, und 100000 dient lediglich als sehr große Maximalgröße.

In der Praxis kann es sinnvoll sein, eine zusätzliche font.leading auf die Höhe; dadurch wird eine Leerzeile unter dem Text eingefügt, was besser aussehen kann, wenn sich direkt unter der Textansicht visuell schwere Steuerelemente befinden.

0 Stimmen

Perfektes Ergebnis in iOS 8.1

0 Stimmen

Die Polsterung war für mich der Schlüssel

8voto

Chuck Krutsinger Punkte 2608

Ab iOS 8 ist es möglich, die Auto-Layout-Funktionen einer UITableView zu nutzen, um die Größe einer UITextView automatisch und ohne eigenen Code zu ändern. Ich habe ein Projekt in github die dies in Aktion zeigt, aber hier ist der Schlüssel:

  1. In der UITextView muss der Bildlauf deaktiviert sein, was Sie programmatisch oder über den Interface Builder tun können. Die Größe wird nicht geändert, wenn der Bildlauf aktiviert ist, da durch den Bildlauf ein größerer Inhalt angezeigt wird.

  2. In viewDidLoad für den UITableViewController müssen Sie einen Wert für estimatedRowHeight festlegen und dann die rowHeight a UITableViewAutomaticDimension .

    • (void)viewDidLoad { [super viewDidLoad]; self.tableView.estimatedRowHeight = self.tableView.rowHeight; self.tableView.rowHeight = UITableViewAutomaticDimension; }
  3. Das Ziel der Projektbereitstellung muss iOS 8 oder höher sein.

1 Stimmen

Von dieser Art von Antworten wird abgeraten. Sie sollten den entsprechenden Code hier posten.

8voto

Peter Stajger Punkte 1615

Ich habe alle Antworten durchgesehen und alle halten die Breite fest und passen nur die Höhe an. Wenn Sie auch die Breite anpassen möchten, können Sie ganz einfach diese Methode verwenden:

Setzen Sie daher bei der Konfiguration Ihrer Textansicht die Option "Scrollen deaktiviert".

textView.isScrollEnabled = false

und dann in der Delegiertenmethode func textViewDidChange(_ textView: UITextView) diesen Code hinzufügen:

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

Ausgänge:

enter image description here

enter image description here

0 Stimmen

Die Delegate-Methode wird nicht aufgerufen @Peter Stajger

7voto

Swaroop S Punkte 480

Wenn Sie autolayout verwenden und sizetofit nicht funktioniert, dann überprüfen Sie bitte einmal Ihre Breitenbeschränkung. Wenn Sie die Breitenbeschränkung vergessen haben, wird die Höhe korrekt sein.

Es ist nicht nötig, eine andere API zu verwenden. Eine einzige Zeile würde alle Probleme lösen.

[_textView sizeToFit];

Hier ging es mir nur um die Höhe, während die Breite fest blieb, und ich hatte die Breitenbeschränkung meiner TextView im Storyboard übersehen.

Damit sollten die dynamischen Inhalte der Dienste angezeigt werden.

Ich hoffe, das könnte helfen.

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