2013-06-28 10 views
5

Próbuję utworzyć NSTextView, który rośnie pionowo, gdy użytkownik wpisuje i przewija, gdy wysokość osiągnęła maksimum. Jest to podobne do widoku tekstowego w Wiadomościach działa.Growing NSTextView pasuje do zawartości jest wycinanie ostatniej linii tekstu

Moja pierwsza próba wykorzystuje delegata do nasłuchiwania zmian tekstowych i ustawić ograniczenie wysokości związane z NSTextView za przewijania Widok:

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

To prawie działa: wysokość widoku tekstowego (przewijania widoku danych) jest aktualizowana jak ja typ, jednak ostatnia linia tekstu jest obcięty:

enter image description here

Gdy widok przewijania osiągnie wysokość to max i rozpoczyna przewijanie działa ładnie. Próbowałem wymusić aktualizację wyświetlania/układu/ograniczenia w otaczającym widoku przewijania bez powodzenia. Domyślam się, że widok przewijania widoku przewijania nie jest poprawnie aktualizowany i przycina dolną część widoku tekstu. Czy jest jakiś sposób zmusić widok klipu/przewijania widoku do aktualizacji odpowiednio, gdy ograniczenie się zmienia?

+0

Rozwiązałeś to? – KVISH

Odpowiedz

0

Nie jestem pewien, czy byłoby to przydatne, ale napisałem podnoszącą poziom podrzędną NSTextView, która jest available on GitHub. Zapraszam do obejrzenia lub dopasowania, jak chcesz.

+0

Dzięki - używam automatycznego układu (i polegam na nim) w widoku nadrzędnym widoku tekstu, więc nie jestem pewien, czy będę mógł korzystać z rozwijanego widoku tekstu. Mam nadzieję, że wskaże mi to we właściwym kierunku. – ppilone

+0

Skąd wziął się twój kod do działania? Używam go w interfejsie typu czat (twój tekst na dole) i jego "nie działa. Taki sam problem jak powyżej. – KVISH

+0

Właśnie przejrzałem mój kod (po 3 latach ..) i myślę, że mam to działa z AutoLayout. Wprowadzę moje zmiany do GitHub w ciągu sekundy –

0

Uważam, że ustawiasz wysokość NSTextView do rozmiaru wymaganego dla elementu textContainer, ale nie uwzględniasz wstawki dodawanej do widoku tekstowego. Spróbuj dodać wysokość -[NSTextView textContainerInset] do obliczonej wysokości.

Dokumentacja tak naprawdę nie określa, ale zakładam, że textContainerInset zwraca całkowitą wstawkę dla szerokości/wysokości ze wszystkich stron i że -[NSTextView textContainerOrigin] z grubsza podzieliłaby to na pół.

Powiązane problemy