2010-10-12 8 views
6

Mam dwa zagnieżdżone widoki UIScrollView: rodzic ograniczony do stronicowania poziomego i dziecko jest ograniczone do przewijania w pionie. Treść to jeden duży widok, który można swobodnie przeciągać, ale przyciąga do jednej z trzech sekcji poziomych. Domyślne zachowanie zagnieżdżonych widoków przewijania pozwala tylko na przewijanie w jednym kierunku na raz, ale chciałem pozwolić na równoczesne przeciąganie w obu kierunkach, aby utrzymać wrażenie manipulowania pojedynczym dużym widokiem.Zagnieżdżone jednoczesne przewijanie UIScrollViews

Moje obecne rozwiązanie zaangażowany izolowanie gestu przewijania pionowego widoku danych oraz ustawienie jego delegata do mojego kontrolera widoku:

for (UIGestureRecognizer *gesture in scrollView.gestureRecognizers) 
    if ([gesture isKindOfClass:[UIPanGestureRecognizer class]]) 
     gesture.delegate = self; 

Potem wdrożył metodę delegata, aby umożliwić gesty widoku stronicowania rozpoznawać równocześnie z pan gest widoku przewijania:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if (gestureRecognizer.view == scrollView && otherGestureRecognizer.view == pageView) 
     return YES; // allow simultaneous scrolling of pageView and scrollView 

    return NO; 
} 

rozwiązanie to przeważnie działa, ale od czasu do czasu będzie działać glitchy kiedy przeciągnij widok dookoła, szczególnie kiedy przenieść się szybko za pomocą myszki lub przeciągnąć go wokół przeszłości granice widoku. W szczególności jeden z widoków przewijania tymczasowo przeskakuje z powrotem do miejsca, w którym się rozpoczął, tak jakby ten gest został anulowany, ale potem odskoczy, jeśli dalej będę przewijać.

Chcę wiedzieć, czy istnieje prostsza lub bardziej niezawodna metoda przewijania w taki sposób, jaki przeoczyłem, lub czy jest coś, co mogę zrobić, aby wyeliminować uciążliwe zachowanie.

+0

Zrobiłem coś podobnego, jak sądzę, i działa idealnie. Czy próbujesz w zasadzie mieć duży obszar do przewijania, który ma stale górny i lewy obszar informujący użytkownika, gdzie są? – Rudiger

+0

Niezupełnie; to, co wyświetlam, to trzy drzewa talentów dla klasy w grze MMO. Zamiast traktować każde drzewo jako niezależną stronę, chciałem pozwolić swobodnie przeciągać widok dookoła, ale mam to zablokować do jednego z drzew po zwolnieniu przeciągnięcia.Widziałem inne aplikacje, które używają podobnych zachowań, a konkretnie aplikację WoW Armory, która wyświetla drzewa talentów dla tej gry. – trevorsm

+0

Ach, rozumiem, trochę później, jeśli pomyślę o czymś w rodzaju "NSInvalidArgumentException" – Rudiger

Odpowiedz

3

Nienormalne zachowanie miało miejsce, gdy widoki zostały przeciągnięte z obszaru zawartości, zwolnione, a następnie stuknięte/przeciągnięte ponownie, zanim przewijają się widoki przewijania. Może się to zdarzyć, na przykład, gdy widok został przewinięty kilkoma niewielkimi przesunięciami. Jeden z widoków przewijania zmieszałby się i spróbowałby spowolnić (odskok) podczas jednoczesnego przeciągania, powodując drgania tam i z powrotem między początkiem i miejscem, w którym został przeciągnięty.

Udało mi się to naprawić, odwracając zagnieżdżanie widoków przewijania (widok stronicowania w pionowym przewijanym widoku) i dodając delegata do widoku UIPanGestureRecognizer widoku stronicowania zamiast gestu przewijania widoku. Teraz przewija się w naturalny sposób, jakby był pojedynczym widokiem przewijania, a jednocześnie dostosowuje się do stronicowania tylko w kierunku poziomym. Nie sądzę, aby było to przeznaczone do przewijania widoków, aby można było je jednocześnie przewijać w ten sposób, więc nie jestem pewien, czy pierwotne zachowanie było wynikiem błędu, czy tylko konsekwencją zrobienia czegoś niezamierzonego.

2

Po prostu borykałem się z tym i uderzałem w ścianę z "NSInvalidArgumentException", powód: "Wbudowany w przeglądarce UIScrollView mechanizm rozpoznawania panoram musi mieć swój przewijany widok jako delegata". jak wskazano powyżej: Rythmic Fistman.

znalazł sposób wokół niego ... najpierw podklasy wewnętrzną UIScrollView i uczynić go jako

Następnie wszystko co musisz zrobić w realizacji jest:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
return YES; 
} 

wydaje się działać prawidłowo.

+0

sprawiają, że jako ... co? –

+0

Dosłownie nie mam pojęcia: D –

Powiązane problemy