2011-02-07 2 views
6

Używam UIScrollView jako podstawa składnika, który korzysta z rdzenia animacji. Kiedy użytkownik przesuwa widok, chciałbym umieścić elementy zgodnie z położeniem docelowym (spoczynkowym) widoku przewijania. W tym celu muszę obliczyć docelowy contentOffset z UIScrollView w metody scrollViewWillBeginDecelerating: lub podobne.Jak obliczyć docelowy contentOffset z UIScrollView w ruchu

Powodem, dla którego tego potrzebuję jest to, że będę używał docelowego contentOffset do animowania widoków zagnieżdżonych w contentView widoku scrollview do ich ostatecznej pozycji. Mogłem oczywiście ustawić obserwatora na contentOffset lub podobnym, ale spowodowałoby to chaotyczną animację, ponieważ zagnieżdżone widoki aktualizowałyby swoje pozycje wielokrotnie podczas zwalniania. Chciałbym, żeby to się stało tylko raz.

Czy istnieje prosty sposób na zrobienie tego?

+2

Wydaje się ktoś inny ma taką potrzebę zbyt: http://stackoverflow.com/questions/1651560/predicting-the-resting-offset-in-a-uiscrollview-after-deceleration – Tricky

Odpowiedz

0

Czy istnieje szczególny powód, dla którego musisz wiedzieć z góry, gdzie ma się zatrzymać widok przewijania? Możesz ustawić swoje widoki w layoutSubviews (jeśli podklasa UIScrollView) lub w scrollViewDidScroll: w implementacji delegata przewijania widoku.

+1

Witam, tak jest . Będę używał pozycji do animowania widoków zagnieżdżonych w contentView widoku przewijania do ich ostatecznej pozycji. Mogłem oczywiście ustawić obserwatora na contentOffset lub podobnym, ale spowodowałoby to chaotyczną animację, ponieważ zagnieżdżone widoki aktualizowałyby swoje pozycje wielokrotnie podczas zwalniania. – Tricky

0

Uważam, że odnoszą się Państwo do zachowania automatycznie udostępnionego przez pagingEnabled na UIScrollView. Od iOS Reference Library na UIScrollView, gdy włączona jest funkcja stronicowania, "widok przewijania zatrzymuje się na wielokrotnościach granic przewijania, gdy użytkownik przewija." Używam tego zachowania przez cały czas i uważam, że to właśnie opisujesz. Obsługuje on całą ciężką pracę - wystarczy ustawić jedną nieruchomość!

AKTUALIZACJA: Myślę, że źle zrozumiałem twoje pytanie. Zawsze możesz sprawdzić właściwość contentOffset obiektu UIScrollView, aby określić jego bieżące pochodzenie w widoku przewijania. Możesz to zrobić w jednej z metod delegowania, prawdopodobnie scrollViewDidEndDecelerating:.

+0

Tak, można pobrać bieżący contentOffset, ale potrzebuję docelowego contentOffset ... – Tricky

+0

Skąd można znać ostateczny contentOffset, dopóki scrollview nie zostanie przeniesiony? – rcw3

1

Jest to metoda delegata na to:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS5(5_0); 

Według doc:

wezwał palcem w górę, jeśli użytkownik przeciągane. prędkość jest w punktach/sekundę. Obiekt docelowyContentOffset może zostać zmieniony, aby dostosować miejsce, w którym przewija się widok przewijania. nie jest wywoływane, gdy pagingEnabled jest TAK

0

Nie jestem pewien, czy nadal tego potrzebujesz. ale w ten sposób można uzyskać delegata UIScrollView.

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ 
NSLog(@"X offset: %f", targetContentOffset->x); 
NSLog(@"Y offset: %f", targetContentOffset->y); 
}