Wenn Sie NSTextView an den Inhalt anpassen, wird die letzte Textzeile abgeschnitten

Ich versuche, eine NSTextView zu erstellen, die vertikal wächst, wenn der Benutzer tippt und einen Bildlauf durchführt, sobald die Höhe ein Maximum erreicht hat. Dies ist ähnlich wie die Textansicht in Nachrichten funktioniert.

Mein erster Versuch verwendet den Delegaten, um auf Textänderungen zu achten und die mit der Bildlaufansicht von NSTextView verknüpfte Höhenbeschränkung anzupassen:

- (void)textDidChange:(NSNotification *)notification
{
    NSTextView *textView = self.textView;
    NSRect usedRect = [textView.textContainer.layoutManager usedRectForTextContainer:textView.textContainer];
    NSLog(@"DEBUG: used rect: %@", NSStringFromRect(usedRect));
    self.textViewHeightConstraint.constant = MIN(80.f, MAX(usedRect.size.height, 30.f));
}

Dies funktioniert fast: Die Höhe der Textansicht (Bildlaufansicht) wird während der Eingabe aktualisiert, die letzte Textzeile wird jedoch abgeschnitten:

Sobald die Bildlaufansicht die maximale Höhe erreicht hat und mit dem Scrollen beginnt, funktioniert es einwandfrei. Ich habe versucht, eine Anzeige- / Layout- / Einschränkungsaktualisierung in der beiliegenden Bildlaufansicht zu erzwingen, ohne Erfolg. Ich vermute, die Clip-Ansicht der Bildlaufansicht wird nicht korrekt aktualisiert und schneidet den unteren Bereich der Textansicht aus. Gibt es eine Möglichkeit, die Aktualisierung der Clip- / Bildlaufansicht zu erzwingen, wenn sich die Einschränkung ändert?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage