2014-12-05 9 views
7

Podczas korzystania moveRowAtIndexPath:toIndexPath: przenieść UITableViewCell, Widzę usterki animacji przy użyciu estimatedRowHeight i UITableViewAutomaticDimension gdy komórka animuje z widocznym stanie do niewidocznego stanu.UITableViewCell animacja bug w `moveRowAtIndexPath: toIndexPath:` `estimatedRowHeight` podczas używania i` UITableViewAutomaticDimension`

Problem zniknie, jeśli wyraźnie ustawię wysokość komórek, wprowadzając tableView:heightForRowAtIndexPath:. Problem pojawia się tylko wtedy, gdy ścieżki indeksu źródłowego i docelowego są odpowiednio widoczne i niewidoczne. Gdy komórka przechodzi do innej widocznej ścieżki indeksu, animacja zachowuje się zgodnie z oczekiwaniami.

Utworzyłem przykładowy projekt w celu zilustrowania wpływu: https://github.com/timarnold/Table-Cell-Sizing-Bug

http://www.openradar.me/19156703

Edit

@rdelmar wskazał, że moje pytanie nie rzeczywiście zadać pytanie.

Czy ktoś wie o sposobie obejścia tego błędu i naprawienia tego zachowania? Czy robię coś złego?

Edit 2014-12-08

Kiedyś jeden z moich Apple dostarczonych biletów wsparcia deweloper uzyskać informację o tym problemie z Apple. Potwierdzili, że to błąd (wizyta pod numerem http://www.openradar.me/19156703) i nie dostarczyli żadnych obejść.

+0

Wiesz, jak to naprawić, więc jakie jest twoje pytanie? Myślę, że jest to przypadek "dostajesz za co płacisz" (płaca jest czasem i złożonością kodu). To i problemy z przewijaniem do konkretnej ścieżki indeksu są konsekwencją sposobu, w jaki są używane szacowane wysokości, więc nie sądzę, że możesz to naprawić (interesujące będzie sprawdzenie, czy Apple może to naprawić bez poświęcania prędkości używając szacowanych wysokości). Prawdopodobnie możesz zminimalizować efekt, zapewniając dokładniejsze oszacowanie wysokości (choć to niewiele pomoże, jeśli masz bardzo różne wysokości). – rdelmar

+0

Cóż, to nie jest tak bardzo pytanie, ponieważ jest to dokumentacja problemu i prośba o potencjalne obejścia (przypuszczam, że moja prośba powinna być bardziej jednoznaczna, będzie edytować pytanie). Sądzę, że to uczciwe zakwalifikować to zachowanie jako błąd, ponieważ projekt do odtworzenia jest dość prosty i wykorzystuje wszystkie podstawowe składniki i możliwości. –

+0

Nie wiem, czy nazwałbym to błędem, czy tylko konsekwencją wymiany pomiędzy szybkością i poprawnością, którą stworzył Apple. Jest to technika, która zadziała w niektórych przypadkach, ale nie we wszystkich. Myślę, że jedyną pracą dookoła jest obliczyć wysokość w sposób "staroświecki" - mam nadzieję, że się mylę, ponieważ nowe komórki samokonujące są świetne, gdy pracują. – rdelmar

Odpowiedz

-2

Tim,

To nie jest ostateczna odpowiedź, ale kilka ciekawych spostrzeżeń. Zamiast błędu uważam, że zachowanie, którego doświadczasz, jest związane ze sposobem, w jaki iOS rysuje komórkę na ekranie urządzenia. Dokładniej, do komórek, które są poza ekranem. Ponieważ na dane źródło nie wpływają komórki zmieniające kolejność iOS tracą pozycję komórki.

aby mój punkt jaśniejsze Zrobiłem następujące modyfikacje TableViewController.m:

W didSelectRowAtIndexPath

[tableView moveRowAtIndexPath:indexPath 
          toIndexPath:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:indexPath.section]]; 

W cellForRowAtIndexPath

cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row + 1]; 


Zobaczysz, że komórki misbehave tylko po przejściu do pozycji poza widokiem ekranu. Dodatkowo, komórki są przerysowywane za każdym razem, gdy przesuniesz ekran.

+1

Jaka jest różnica między "błędem" a "zachowaniem, którego doświadczasz" nie odpowiada oczekiwanemu zachowaniu, które powinna zawierać dokumentacja? –

+0

@AnthonyMattox Twoje pytanie nie jest jasne. Nigdy nie wspomniałem o dokumentacji. Testowałem kod. – carlodurso

0

Spróbuj zwiększyć wysokość komórki pamięci podręcznej.

private var cellHeights = [NSIndexPath: CGFloat]() 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if let cachedHeight = cellHeights[indexPath] { 
     return cachedHeight 
    } else { 
     return 60 
    } 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    cellHeights[indexPath] = cell.frame.height 
} 
Powiązane problemy