Podczas korzystania z UIPAGEVIEWController użytkownik może przesuwać się w prawo lub w lewo, aby utworzyć animowaną kolejkę, która następuje palcem. Lub użytkownik może po prostu dotknąć jednej strony widoku strony lub drugiego, aby spowodować obrót strony. Po zakończeniu animacji kolejowej, metoda delegata pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: jest wywoływana.

Chciałbym, aby moja ostatnia strona była nieco inna, w zależności od tego, czy użytkownik obrócił stronę z przesuwaniem lub kranem. Ale nie mogę zrozumieć solidnego sposobu ustalenia, co spowodowało obrót strony. Metoda pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: nie zapewnia tych informacji.

W moim deleacie UipageViewController (self), nazywa się metoda gestureRecognizer:shouldReceiveTouch:, ale jest nazywany zarówno do przesuwania (patelni), jak i rozpoznawania gestu dotknij, nawet jeśli użytkownik jest ostatecznie zatrudniający tylko jeden lub drugi gest. Metoda gestu delegata jest nazywana momentem, w którym ekran jest dotknięty przez gest. Więc to nie pomaga.

Dodałem zestaw detekcji przechwytywania związanych z dotykiem do widoku strony. Dla touchesBegan:withEvent: Zresetowałem flagę. Dla touches:moved:, który nie jest wywoływany do gestu kranu, ustawam flagę. Ten rodzaj prac, ale jest zbyt niski poziom i może nie działać poprawnie na inny rodzaj gestu w przyszłości, która również się porusza, ale nie jest machnięciem / patelni. A gest kranu UipageViewController wydaje się całkowicie wywołać zdarzenie dotykowe, więc nie nazywany jest nawet touchesBegan:withEvent: (co jest dziwne).

Czy jest jakiś sposób na rozróżnienie solidully , po tym, jakim stylu stulenia strony (Dotknij lub Pan / Swipe) A UIPAGEVIEWController użył do obsługi interakcji użytkownika, aby zmienić stronę?

1
jsbox 25 luty 2019, 22:25

2 odpowiedzi

Najlepsza odpowiedź

Pytanie brzmi naprawdę, jak określić, który z kilku rozpoznawców gestów jest odpowiedzialny za coś się dzieje.

Kluczem do zrozumienia jest to, że każdy rozpoznawca gestu może mieć więcej niż jeden zainstalowany cel / akcję. UIPAAGEVIEWController ustawia własne docelowe / działania wewnętrznie, ale nie wyklucza dodawania innych.

Podczas konfigurowania podkracji UIPAAGEVIEWController po załadowaniu lub instancji dodaj następujący kod (lub równoważny kodu SWIFT):

for (UIGestureRecognizer *gr in self.gestureRecognizers) {
    if ([gr class] == [UIPanGestureRecognizer class])
        [gr addTarget:self action:@selector(panGestureOccurred)];
     else if ([gr class] == [UITapGestureRecognizer class])
        [gr addTarget:self action:@selector(tapGestureOccurred)];
    }

Następnie dodaj dwie metody docelowe / działania do podkategorii:

- (void)tapGestureOccurred
{
    // Set a flag here to rely on later after the page turn
}

- (void)panGestureOccurred
{
    // Reset a flag here to rely on later after the page turn
}

To oczywiście uogólnia dla jakichkolwiek innych rodzajów gestów, ale obecnie tylko patelnia i gesty stukania wydają się obsługiwać przez UIPageViewController.

panGestureOccurred zostanie nazwany wielokrotnie, gdy użytkownik dotykający ekranu i przeniesienie palec / rysika. tapGestureOccurred jest nazywany tylko raz.

Ale tylko jedna z dwóch metod zostanie wywoływana, w zależności od rozpoznawania gestu sterownika strony w swojej nieskończonej mądrości decyduje wygrywa. Wszystko wydaje się działać znacznie bardziej solidnie niż zbyt niski poziom touchesBegan i touchesMoved pomysł z pierwotnym pytaniem.

0
jsbox 25 luty 2019, 21:13

W gestureRecognizer:shouldReceiveTouch: Możesz sprawdzić typ gestu.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if gestureRecognizer is UITapGestureRecognizer {
       self.wasTap = true;
       self.wasSwipe = false;
    } else if gestureRecognizer is UISwipeGestureRecognizer {
       self.wasTap = false;
       self.wasSwipe = true;
    }
    return true;
}

Następnie w pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: Zmień stan ostatniej strony na podstawie boolskiego, który jest prawdziwy.

1
Nordeast 25 luty 2019, 19:46