2013-06-28 16 views
5

Sto provando a creare un NSTextView che cresce in verticale mentre l'utente digita e scorre quando l'altezza ha raggiunto il massimo. Questo è simile alla visualizzazione del testo in Messaggi funziona.La crescita di NSTextView per adattarsi al contenuto è ritagliata nell'ultima riga di testo

Il mio primo tentativo utilizza il delegato per l'ascolto di modifiche al testo e regolare il vincolo di altezza associata con la vista di scorrimento del NSTextView:

- (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)); 
} 

Questo funziona quasi: (di vista di scorrimento) della vista altezza del testo viene aggiornata come ho tipo, tuttavia, viene tagliato l'ultima riga di testo:

enter image description here

Una volta che la vista di scorrimento raggiunge il suo altezza massima e comincia a scorrimento funziona bene. Ho provato a forzare un aggiornamento di visualizzazione/layout/vincolo sulla vista a scorrimento chiusa senza fortuna. La mia ipotesi è che la visualizzazione di clip della vista di scorrimento non si aggiorni correttamente e che si ritagli nella parte inferiore della visualizzazione di testo. C'è un modo per forzare la visualizzazione clip/vista di scorrimento per aggiornare in modo appropriato quando il vincolo cambia?

+0

Hai risolto questo? – KVISH

risposta

0

Non sono sicuro che sarebbe utile, ma ho scritto una sottoclasse NSTextView in espansione verticale, ovvero available on GitHub. Sentiti libero di dare un'occhiata o regolare come vuoi.

+0

Grazie - Sto usando il layout automatico (e ci sto facendo affidamento su di esso) nella vista padre della vista del testo, quindi non sono sicuro che sarò in grado di usare la tua vista del testo espandibile. Sperando che mi punti nella giusta direzione però. – ppilone

+0

come hai fatto a far funzionare il tuo codice? Lo sto usando in una chat come interfaccia (la tua textview in basso) e il suo 'non funziona. Lo stesso problema di cui sopra. – KVISH

+0

Ho appena rivisitato il mio codice (dopo 3 anni ..) e penso di averlo funzionato con AutoLayout. Impegnerò le mie modifiche a GitHub in un secondo –

0

Credo che si stia impostando l'altezza di NSTextView sulla dimensione necessaria per textContainer ma non si tiene conto dell'inserimento che la visualizzazione di testo sta aggiungendo. Prova ad aggiungere l'altezza di -[NSTextView textContainerInset] all'altezza calcolata.

La documentazione in realtà non specifica, ma sto supponendo che textContainerInset restituisce l'inserto totale per larghezza/altezza su tutti i lati e che -[NSTextView textContainerOrigin] sarebbe grosso modo dividere che a metà.

Problemi correlati