2017-01-30 33 views
5

Mam normalne UITableView w moim UIViewController, ograniczone do pełnego ekranu. Ten tableView ma niestandardowy interaktywny tableHeaderView. TableHeaderView ma rozmiar dynamiczny i rozwija się samodzielnie. Plik headerView ma pole tekstowe i zmieni swój rozmiar w zależności od tego, czy pole TextField jest aktywne, czy nie.Komórki znikające podczas animacji UITableView

Problem polega na tym, że komórki u dołu ekranu nie zawsze są prawidłowo animowane podczas zmiany rozmiaru tableHeaderView. Zadzwonię pod tableView.beginUpdates() i tableView.endUpdates() po layoutIfNeeded() w moim bloku animacji. To musi być zrobione, albo komórki nie będą w ogóle podążać za rozmiarem dynamicznym.

Zrobiłem ten gif. Spójrz szczególnie na dolne komórki podczas animacji. Znacznie spowolniłem animację, więc łatwo jest dostrzec problem.

gif of problem

Rozmyślanie: Wydaje mi się, jakby tableView domaga cellForRow:indexPath: jak tylko zacznie się animacja, i jakoś dowiaduje się, co podać całą tableView będzie po animację i usuwanie niepotrzebnych komórek, mimo że animacja jeszcze się nie zakończyła. Tak samo, gdy zwijamy nagłówek: najniższe komórki nie są animowane w ten sam sposób, co już załadowane komórki. Animowane są w innej animacji ..

Dlaczego tak się dzieje? Czy można temu zapobiec?

Edycja: Kod Animacja

self.navigationController?.setNavigationBarHidden(isEditing, animated: true) 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 

    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.setContentOffset(point, animated: false) 
    }  

    tableHeaderView.frame = frame 
    tableHeaderView.layoutIfNeeded() 
    self.view.layoutIfNeeded() 
    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+2

Czy możesz pokazać kod? – jalone

+0

W scenopisie - wybierz scenę -> pokaż inspektora atrybutów -> pod górnymi pasami, odznacz pole pod górnym paskiem. – Pavankumar

+0

@Sti: Użyj należy udostępnić niektóre kod. – Poles

Odpowiedz

0

Ok, spróbuję zaproponować moją wersję, choć nie mogę sprawdzić, ponieważ nie widzę swojego projektu. Nie próbowałem go skompilować, więc może mieć błędy.

var navFrame = self.navigationController?.navigationBar.frame 
navFrame.origin.y = isEditing ? -navFrame.size.height : 0 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 
    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.contentOffset = point 
    } 

    self.navigationController?.navigationBar.frame = navFrame 

    tableHeaderView.frame = frame 

    self.view.layoutIfNeeded() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+0

Dzięki, spróbuję tego, gdy dostanę czas, aby spróbować. Jedno pytanie, dlaczego ręcznie ukryć pasek nawigacyjny zamiast używać "self.navigationController? .setNavigationBarHidden (isEditing, animated: true)" tak jak już miałem? Myślisz, że to może być związane z problemem? – Sti

+0

@St. Tak, prawdopodobnie konflikt animacji. – jesse

0

Właśnie słyszałem z powrotem od dewelopera zespołem pomocy technicznej firmy Apple, dotyczące tej kwestii, a oto ich odpowiedź verbatim (Kopalnia nacisk):

Witam Nicolas,

Dziękuję za kontakt z działem wsparcia technicznego dla programistów Apple (DTS).

Opisane zachowanie i wynikające z nich ograniczenia są zgodne z projektem.

Jeśli uważasz, że alternatywne podejście powinno być uznane przez Apple, zachęcamy cię złożyć wniosek enhancement z informacjami na jak ta decyzja projektowa oddziaływań, a to, czego chcesz zobaczyć zrobione inaczej.

Chociaż nie ma obietnicy, że zachowanie zostanie zmienione, to jest to najlepszy sposób, aby upewnić się, że myśli na ten temat są postrzegane przez zespół odpowiedzialny za podjęcie decyzji przez zespół odpowiedzialny za .

Pozdrawiam,

Jabłko programisty Pomoc techniczna

Wydaje jesteśmy po prostu skazani na konieczności korzystania z prostego połączenia do obu tableView.setContentOffset(_:animated:) lub tableView.scrollToRow(at:at:animated:).

+0

Jak ustawiłby to setContentOffset lub scrollToRow? – Sti

+0

Nie jest - utknęliśmy przy użyciu standardowych wywołań metod bez możliwości synchronizacji z niestandardową animacją - dlatego zespół sugeruje, abyśmy złożyli prośbę o ulepszenie. Innymi słowy, możesz "naprawić" go, przenosząc swoje połączenie do jednej z tych metod poza blokiem animacji. – gomollon