8

Jak mogę zrobić, aby moje komórki były przerysowywane po obróceniu urządzenia?iOS - Redraw TableViewCells z dynamicznymi wysokościami komórek przy obrocie

Kiedy testuję na iPhonie, domyślna orientacja to portret, więc moje dynamiczne komórki są tak wysokie, jak powinny być, gdy urządzenie znajduje się w orientacji pionowej: oznacza to, że kiedy obracam się do krajobrazu, jest dużo pusta przestrzeń w komórce. Kiedy testuję na iPadzie, jest odwrotnie. Po obróceniu do orientacji pionowej część tekstu zostaje obcięta, ponieważ domyślnie jest to krajobraz. Mam oddzielne storyboardy dla obu urządzeniach, a oba kontrolery widoku są ustawione na „Orientacja: wnioskować”

enter image description here (Portret) enter image description here (Pejzaż)

To, co się dzieje na iPhone - etykieta rozciągania ma ciemny czerwone tło, dzięki czemu można zobaczyć rzeczywisty rozmiar etykiety. Jednak wysokość komórki nie jest ponownie obliczana, a ponieważ dolne etykiety są ograniczone do dolnej części komórki, same znajdują się na samym dole. Jeśli dodać ograniczenie z etykiety rozciągania (jednego z tłem) do dolnej części komórki, wszystko robi to rozciągnąć etykietę tak:

enter image description here (Label jest rozciągnięta)

Co to mówi to właśnie teraz nie jestem w stanie przekonać komórki do orientacji i przerysowywania, gdy tylko się zmienią. Oto mój kod heightForRowAtIndexPath że jest obliczania wysokości komórki:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (!self.opCell) 
     { 
      self.opCell = [self.container dequeueReusableCellWithIdentifier:@"OPCell"]; 
     } 
    self.opCell.opName.text = [[self.data objectAtIndex:indexPath.row] valueForKey:@"name"]; 
    [self.opCell layoutIfNeeded]; 
    CGFloat height = [self.opCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 

    return height + 1; 
} 

Do tej pory, aby go obrócić Próbowałem [self.container reloadData], gdzie zbiornik jest mój TableView z willRotateToInterfaceOrientation i didRotateToInterfaceOrientation bezskutecznie. Próbowałem również umieścić go w viewDidLoad, tak aby może wykryć i załadować, gdy widok jest ładowany w trybie poziomym z prawidłową wysokością, ale to też nie działa. W przypadku iPhone'a, bez względu na to, co robię, ładuje wysokość dla widoku pionowego i nie aktualizuje się przy rotacji.

Znalazłem kilka pytań, które moim zdaniem mogłyby pomóc, ale nie mogę sprawić, że pracuję dla mnie this answer, mimo że wydaje mi się to samo pytanie, które mam, i wydaje się, że this one skupia się bardziej na szerokości komórki niż wysokość i nie jestem pewien, czy ma to zastosowanie w taki sam sposób.

Here to nawet samouczek, który, gdy uruchomiłem go na iPhonie, również nie zmienia rozmiaru TableViewCells podczas obracania.

This tutorial wydawało się mieć pewien wgląd w zmianę wysokości stołu, więc dodałem kod begin/endUpdates do mojego didRotateToInterfaceOrientation, myśląc, że może to spowodować zmianę, ale to nie działało tak dobrze.

Tak więc, jeśli ktoś ma jakieś sugestie lub zna rozwiązanie, byłoby to bardzo cenne, ponieważ trafiam na mur z tego!

+0

Powinieneś przenieść rzeczy, które nie mają nic wspólnego z obliczeniem wysokości metody ... to byłby dobry początek. – nhgrif

+1

Potrzebuję całego kodu w mojej metodzie heightForRowAtIndexPath. Muszę zadeklarować komórkę, zadeklarować tytuł, który chcę uczynić wysokością dynamiczną, a następnie powiedzieć, żeby obliczyć wysokość z 2 ostatnich linii. Komórki dynamiczne są trudniejsze, niż powinny, i to działa. –

+1

To jest ładny samouczek, jak utworzyć dynamiczny tableViewCells. http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout – samir

Odpowiedz

0

Więc wymyśliłem mój problem. Po this tutorial dowiedziałem się, że mnie nie było.

musiałem:

  1. podklasy moim etykiety, która została rozciągania i państwa, które preferredMaxLayout spełnia szerokości ekranu

  2. W moim heightForRowAtIndexPath muszę powiedzieć komórkę, aby uzyskać i aktualizować prąd szerokość ekranu

Zobacz samouczek, aby uzyskać więcej informacji. Mam nadzieję, że to pytanie i odpowiedź pomoże komuś w przyszłości, ponieważ było to bardzo kłopotliwe.

-1

Możesz użyć tej samej sztuczki, co here. To jest wołanie:

[tableView beginUpdates]; 
[tableView endUpdates]; 

Bez niczego pomiędzy. Spowoduje to ponowne obliczenie wysokości hełmu dla widoku tabeli.

+0

Jak już powiedziałem, próbowałem tego już i nie otrzymuję żadnych wyników. Próbowałem umieścić tę metodę w 'ViewDidLoad',' viewDidLayoutSubviews', 'heightForRowAtIndexPath',' didRotateFromInterfaceOrientation' oraz 'reloadRowsAtIndexPath'. Czy jest jeszcze gdzieś, gdzie powinienem to powiedzieć? –

+0

Wstawiłbym tylko w 'didRotateFromInterfaceOrientation'. Większość innych metod, o których wspomniałeś, jest wyzwalanych przez 'begin' /' endUpdates' i może powodować pętlę. – Rivera

+0

Próbowałem już tylko tam, a także w innych lokalizacjach, to po prostu nie działa dla mnie. –

1

Wygląda na to, że robisz tutaj zawijanie słów.Zgodnie z moim wcześniejszym doświadczeniem sugeruję:
1) użycie sizeWithFont lub nowszej wersji iOS7 z odpowiednim trybem linebreak.
2) Możesz zaimplementować layoutSubview dla swojego "opCell", gdzie możesz zmienić definicję rozmiaru ramki.
3) Oblicz wysokość komórki podczas obrotu. Upewnij się, że poprawnie ustawiłeś szerokość zgodnie z nowymi granicami TableView.
4) Można również zaimplementować estimHeightForRowAtIndexPath dla szybkiego oszacowania rozmiaru dla operacji ponownego ładowania tabeli.

Mam nadzieję, że to pomoże!

+0

1) Obecnie zmieniam rozmiar etykiety po prostu używając liczby linii w scenorysach i wydaje się, że działa. Czy powinienem używać sizeWithFont w like, heightForRowAtIndexPath? czy to tylko zmieni wysokość etykiety? i dla 2 i 3 Jak zaimplementować rozmiar komórki w tych metodach, jeśli robię to tam zamiast heightForRowAtIndexPath? –

Powiązane problemy