2014-09-11 9 views
20

System iOS 8 wprowadził sposób wyświetlania tabeli, aby automatycznie dostosować wysokość komórki na podstawie ich zawartości (za pośrednictwem funkcji AutoLayout).Automatyczne dopasowywanie rozmiaru iOS 8 UITableViewCell z UITextView

// in viewDidLoad: 
tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 44.0 

ja już mam to praca z etykietami, obrazów itp

Jednak nie mogę wymyślić sposób na komórce widoku tabeli rosną automatycznie, gdy komórka widoku tekst zmian? Więcej informacji na temat konfiguracji: Wyłączyłem też przewijanie w widoku tekstowym.

Próbowałem również ręcznie zmienić ograniczenie wysokości komórki, ale komórka również nie przyjmie tych zmian.

+0

żadnego postępu w tej jednej? Szukam tego samego ... Czy próbujesz uruchomić go, gdy użytkownik wpisze? Czy też UITextView, którego używasz, nie można edytować przez użytkownika? – Georg

Odpowiedz

4

Odśwież komórkę w sposobie swojej UITextViewDelegate

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

textViewDidBeginEditing: Oczywiście należy zmienić indexpath do właściwego dla danej komórki. To spowoduje, że komórka zaktualizuje swoje ograniczenia i zmieni rozmiar samej siebie.

+0

Oczywiście, że to działa, ale szukam bardziej eleganckiej metody. – Alex

+2

Wygląda na to, że działa nawet bez 'reloadRowsAtIndexPaths:', która ma zalety klawiatury, aby tam pozostać – Georg

+2

Dla mnie to podejście powoduje, że widok tabeli przewija się z powrotem na górę przy każdym naciśnięciu klawisza, co powoduje, że widok tekstu zasadniczo nie nadaje się do użytku - ktoś jeszcze ma ten problem? (iOS 8.1.2) – James

0

Jest to funkcja, której używam, która rozwiązuje problem z widokiem tabeli odskakującym po każdym naciśnięciu klawisza.

- (void)textViewDidChange:(UITextView *)textView { 

    CGFloat fixedWidth = textView.frame.size.width; 
    CGSize oldSize = textView.frame.size; 
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; 
     // Resize cell only when cell's size changes, to prevent bouncing back and forth. 
     if (oldSize.height != newSize.height) { 
     [UIView setAnimationsEnabled:NO]; 
     CGRect newFrame = textView.frame; 
     newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height); 
     textView.frame = newFrame; 
     [self.tableView beginUpdates]; 
     [self.tableView endUpdates]; 
     [UIView setAnimationsEnabled:YES]; 
     } 
    } 
+1

Co się stanie, jeśli komórka znajduje się na dole i musisz przewinąć do tego punktu, aby była widoczna podczas edycji wiersza? – Angie

+0

Tak, mam też ten problem niestety. NIE MA CLUE, jak to naprawić. – Bawpotter

18

Jeśli wszystko jest prawidłowo skonfigurowane (ograniczenia Auto Układ) Państwo nie trzeba obliczać niczego sobie.

Wszystko, co musisz zrobić, to wyłączyć funkcję włączania przewijania UITextView, a następnie textViewDidChange wywołanie tableView.beginUpdates() i tableView.endUpdates().

Aby uzyskać szczegółowe wyjaśnienie, zapoznaj się z post I wrote, który zawiera również przykładowy projekt roboczy.

+0

Czy to też działa dla UIWebView zamiast UITextView? –

+0

Nie jestem pewien, UIWebView może mieć inną procedurę układania, ale warto spróbować! – Jure

+0

Właśnie usunięto włączone przewijanie, działające samodzielnie. dzięki :) – shyamsundar1988

0

rozwiązanie dla Swift 4

func textViewDidChange(_ textView: UITextView) { 
    let fixedWidth = textView.frame.size.width 
    let oldSize = textView.frame.size 
    let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))) 
    if oldSize.height != newSize.height { 
     UIView.setAnimationsEnabled(false) 
     var newFrame = textView.frame 
     newFrame.size = CGSize(width: fmax(newSize.width, fixedWidth), height: newSize.height) 
     textView.frame = newFrame 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
     UIView.setAnimationsEnabled(true) 
    } 
} 
Powiązane problemy