2012-11-21 19 views
10

Tworzę sekcję komentarzy podobną do tej, której używa Facebook do swojej sekcji wiadomości w aplikacji na iOS. Chcę, aby UITextView zmienił wysokość, więc tekst, który piszę, zmieści się w środku, a nie trzeba przewijać, aby zobaczyć tekst, który się przepełnia. Jakieś pomysły, jak mogę to zrobić? Przyjrzeliśmy się może za pomocą CGRect, który jest przypisany do wielkości i wysokości widoku tekstu, który następnie odpowiadającym rozmiarowi treści:Jak zmienić rozmiar UITextView podczas pisania w środku?

CGRect textFrame = textView.frame; 
textFrame.size.height = textView.contentSize.height; 
textView.frame = textFrame; 

zakładam muszę jakąś funkcję, która wykrywa, gdy tekst osiągnie granice UITextView, a następnie zmienia wysokość widoku? Czy ktoś zmagał się z tym samym pojęciem?

+0

Możesz znaleźć szczegółowe rozwiązanie robocze [tutaj] (http://stackoverflow.com/a/37633816/2066428) – malex

Odpowiedz

20

Możesz dostosować ramkę w tej metodzie delegatów, nie zapomnij ustawić delegata textView na siebie.

-(BOOL)textView:(UITextView *)_textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
     [self adjustFrames]; 
     return YES; 
} 


-(void) adjustFrames 
{ 
    CGRect textFrame = textView.frame; 
    textFrame.size.height = textView.contentSize.height; 
    textView.frame = textFrame; 
} 

to rozwiązanie jest dla iOS6 i przed ... na iOS7 odnoszą się do tego

StackOverflow Answer

+0

Och, naprawdę? Nie myślałem, że to będzie takie proste ... ok, dzięki, dam to! – Ollie177

+0

To działa świetnie dzięki za pomoc! – Ollie177

+3

To nie działa na iOS 7.0 – Stavash

1

contentsize nie będzie działać w iOS 7. Spróbuj tego:

CGFloat textViewContentHeight = textView.contentSize.height; 

textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9); 
+4

dlaczego magiczna liczba? – vvMINOvv

6

To jest moje rozwiązanie, używając autolayout i textView.contentSize.height. Testowane na iOS8 Xcode6.3 beta4.

Na końcu jest jeden haczyk o setContentOffset. Umieszczam go, aby uniknąć "nieprawidłowego" artefaktu contentOffset, gdy liczba linii się zmieni. Dodaje dodatkową niechcianą pustą przestrzeń poniżej ostatniej linii i nie wygląda ładnie, chyba że ustawisz ją zaraz po zmianie wiązania. Zajęło mi to godziny, żeby to rozgryźć!

// set this up somewhere 
let minTextViewHeight: CGFloat = 32 
let maxTextViewHeight: CGFloat = 64 

func textViewDidChange(textView: UITextView) { 

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal 

    if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height 
     height = minTextViewHeight 
    } 
    if (height > maxTextViewHeight) { // max cap 
     height = maxTextViewHeight 
    } 

    if height != textViewHeight.constant { // set when height changed 
     textViewHeight.constant = height // change the value of NSLayoutConstraint 
     textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes 
    } 
} 
+0

gdzie zadeklarowano 'textViewHeight'? – lf215

+1

@ lf215 jest obiektem 'NSLayoutConstraint' dla wysokości UITextView. Zapomniałem dodać przepraszam. – Hlung

+0

Jestem całkiem nowy w tym. Czy możesz rozwinąć/dodać więcej kodu, aby pokazać, jak uzyskać textViewHeight? – lf215

4

Na TableViewController która posiada UITextView zaktualizować dane z tableViewDataSource że zostanie wprowadzone w komórce, a następnie po prostu nazywają to:

tableView.beginUpdates() 
    tableView.endUpdates() 

przeciwieństwie tableView.reloadData(), to nie robi zadzwoń resignFirstResponder

+0

To jest idealne! Dzięki. Tutaj to samo w ObjC: '- (void) textViewDidChange: (UITextView *) textView {[self.tableView beginUpdates]; [self.tableView endUpdates]; } 'Otrzymujesz animację za darmo;) – Holtwick

2

Najpierw należy ustawić minimalne ograniczenia wysokości do TextView:

textView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor, multiplier: 0.20) 

(Upewnij się, że ustawienie greaterThanOrEqualTo Wiązanie tak, że jeśli wysokość rzeczywista zawartość jest większa niż tej wysokości, to ma wewnętrzną wysokość treści)

lub proste stały

textView.heightAnchor.constraint(greaterThanOrEqualToConstant: someConstant) 

Podczas konfigurowania TextView, zestaw isScrollEnabled do false

textView.isScrollEnabled = false 

Teraz, gdy wpiszesz na textView, zwiększy się jego wewnętrzna wysokość, a widok wyświetli go automatycznie.