Jak wywołać scrollViewDidScroll: tak samo jak UIScrollView, ale podczas niestandardowej animacji?

Mam bardzo duży, przewijany poziomo UIScrollView, który ponownie wykorzystuje swoje widoki (przesuwa i aktualizuje je, gdy są poza widocznym obszarem, podobnie jak UITableView używa ponownie komórek). Opiera się to na scrollViewDidScroll: wywołanie delegate, które daje mi rzeczywisty contentOffset i tutaj decyduję, kiedy ponownie użyć określonego widoku podrzędnego. Jak na razie dobrze.

Czasami muszę programowo zmienić contentOffset, ale z niestandardową animacją (bezwładność i odbicie do ostatecznej pozycji). Mogę to zrobić całkiem łatwo za pomocą animacji rdzeniowej.

Problem polega na tym, że podczas niestandardowej animacji scrollViewDidScroll: metoda delegowania nie jest wywoływana -> Muszę to zrobić ręcznie, aby powtórne użycie podglądu działało. Próbowałem zadzwonić do niego z wyzwalaczem czasowym co 0,02 sekundy. Teraz są dwa problemy:

Muszę uzyskać UIScrollView contentOffset za pomocą [[_scrollView.layer presentationLayer] bounds] .origin.x, ponieważ podczas animacji normalny _scrollView.contentOffset nie zmienia się.

Jednak informacje z presentationLayer nie są wystarczające do dokładnej synchronizacji - czasami jest trochę późno.

Problem polega na tym, że nowy contentOffset jest daleki od aktualnej pozycji. Wygląda na to, że wbudowana animacja UIScrollView to CAKeyframeAnimation, a scrollViewDidScroll powinien być wywoływany w pozycjach klatek kluczowych. Ale nie jestem w stanie ich zdobyć.

Jeśli liczę na timer, który jestnie Zsynchronizowane z kluczowymi ramkami widoki są ponownie wykorzystywane w niewłaściwych miejscach i nie widzę ich w ogóle podczas animacji.

Czy ktoś może rzucić trochę światła na to, jak i kiedy dokładnie UIScrollView wywołuje scrollViewDidScroll podczas setContentOffset: X animowany: TAK? Czy można je odtworzyć bez łamania zasad sklepu?

questionAnswers(1)

yourAnswerToTheQuestion