2010-03-21 24 views
5

Oto trudny problem z iPhone'em, nad którym pracuję. Mam trzy widoki UIScrollView na stronie, takie, które przewijają się tylko w poziomie, takie, które przewija się tylko w pionie, i takie, które przewijają się zarówno w poziomie, jak iw pionie. Chcę zablokować widoki razem, tak aby poziome położenie przewijania poziomego pasowało do poziomej lokalizacji głównego widoku przewijania, a pionowe przewijanie podobnie, tak że przeciąganie głównego widoku przewijania steruje poziomymi i pionowymi przewijanymi widokami.Połącz dwa UIScrollView razem

Problem polega na tym, że jestem kompletnie zakłopotany. Rozglądałem się po dokumentacji Apple, ale nie wydaje się, żeby to oficjalnie zrobić. Jedną z myśli, którą miałem, było "klonowanie" dowolnego dotyku na każdym przewijaku do punktu na dwóch pozostałych, ale nie mam pojęcia, jak to zrobić. Jeśli ktoś ma jakiekolwiek przemyślenia na ten temat, bardzo bym to docenił.

Edycja: Próbowałem sugestii podklasy UIScrollView i nadpisując dotknięcia, aby wywołać touchchesMoved w innych widokach przewijania. Niestety, touchMoved nie jest wezwany do przewijania ruchów, ponieważ UIScrollView przechwytuje te ruchy w jakiś sposób i używa ich do sterowania przewijaniem. Zacząłem rozglądać się wokół bardziej niskich rzeczy i znalazłem warstwy przewijania animacji rdzenia, ale najlepiej nie chciałbym odtworzyć UIScrollView od zera. Nadal próbuję to rozgryźć.

Odpowiedz

11

Myślę, że najprostszym sposobem byłoby dodać delegata do scrollviews które realizują następujące metody:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

Następnie można sprawdzić contentOffset, aby sprawdzić, ile faktycznie przewijał scrollview i odpowiednio zaktualizować główny widok przewijania.

+0

Awesome, to działa idealnie. Czuję się teraz trochę głupi, ale dzięki za ustawienie mnie prosto. – johnw188

+0

Jestem oszołomiony tym, jak płynnie to działa. Pomyślałem o tym, ale spodziewałem się, że odbicia itp. Nie będą odbijane i będzie wyglądało źle. Jest doskonały. Dzięki Martin! –

0

Musisz rozszerzyć UIScrollView dla wszystkich trzech zastosowań na ekranie i zastąpić dotknięcia: Zaprojektowano: withEvent: metody wywoływania pozostałych (upewnij się, że nie skończyłeś z kodem kołowym, który kończy się wywoływaniem ponownie!).

Tak więc, na przykład kod w przewijania pozycji dwukierunkowy może opierać się na tym:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [horizontalScrollview touchesMoved:touches withEvent:event]; 
    [verticalScrollview touchesMoved:touches withEvent:event]; 
} 

stosując jakąś dodatkową zmienną (np ControllerLastTouched) można sprawdzić, że przed wywołaniem dwa inne touchesMoved: withEvent: metody.

Powinno to umożliwić Ci zrobić „klonowanie” ty mówisz ...

+0

Hej, więc pomyślałem, że to było to, czego szukałem, ale okazało się, że rzeczy są nieco bardziej złożone, niż myślałem. Kiedy ustawiam tę konfigurację, wszelkie dotknięcia widoku zawartego w UIScrollView zostaną pobrane, ale same ruchy przewijania nie wywołają dotknięć. Jestem prawie pewien, że jest to spowodowane sposobem, w jaki działa UIScrollView - uruchamiają czasomierz po przyziemieniu palca, a jeśli osoba przewija się w określonym przedziale czasowym, rozpoczyna ruch przewijania, w przeciwnym razie przechodzi dotyk do metod obsługi dotykowej widoku. – johnw188