2013-10-13 14 views
9

Dostaję sporadyczne raporty od użytkowników na iOS 7, mówiąc, że UIPanGestureRecognizer przestaje działać na niektórych widokach od czasu do czasu. Powinni móc przesuwać widok w prawo/lewo, ale po prostu się łamie i nie działa z jakiegoś nieznanego powodu. Wymuszenie zamknięcia aplikacji i jej ponowne uruchomienie rozwiązuje problem.UIPanGestureRecognizer czasami nie działa na iOS 7

Ten problem nigdy się na iOS 6. I nie mam żadnego kodu, który wyłącza aparat rozpoznawania gestów w każdym momencie oprócz delegata gestureRecognizerShouldBegin że zmusza gest rozpoznają jedynie patelnie pozioma:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer { 

    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) { 

     CGPoint translation = [gestureRecognizer translationInView:[self superview]]; 

     if (fabsf(translation.x) > fabsf(translation.y)) { 

      if (translation.x > 0) 
       return YES; 
     } 
    } 
    return NO; 
} 

Did cokolwiek zmieni się w UIPanGestureRecognizer (lub po prostu zwykłym UIGestureRecognizer), które może być przyczyną tego problemu?

+0

Czy zweryfikowałeś, że sprawdzanie 'x> y' nie powoduje wcześniejszego wyjścia w czasie, gdy wydaje się, że kreator nie działa? – RyanR

+0

Niestety, nie mogę nawet odtworzyć błędu na żadnym z moich urządzeń, ale otrzymałem wystarczającą liczbę raportów od użytkowników, którzy wiedzą, że to nie tylko pojedynczy użytkownik, który nie wie, co robi. – bmueller

+1

Mam to już kilka razy. 'GestRecognizerShouldBegin' zostaje wywołany i zwraca' YES' poprawnie, ale metoda przypisana do 'UIPanGestureRecognizer' NIE jest wywoływana. Więc rozpoznaje ten gest, ale nie nazywa metody ... – bmueller

Odpowiedz

12

Myślę, że w końcu rozwiązałem ten problem. Wygląda na to, że iOS 7 obsługuje gesty w subviewsach inaczej niż w systemie iOS 6 i wcześniejszych wersjach. Aby to obsługiwać, Apple wprowadził nową Delegat:

(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 

Jeśli wrócisz tak, że powinien dostać twój gest rozpoznawania do pracy. Zaimplementowałem go i nie miałem żadnych problemów do tej pory (choć wprawdzie był to rzadki błąd, którego nie mogłem w wiarygodny sposób odtworzyć, więc możliwe, że jeszcze się nie powtórzył).

Aby uzyskać więcej informacji, zobacz https://stackoverflow.com/a/19892166/1593765.

+1

Niesamowity połów! Dziękuję Ci! :-) – kernix

+0

Mam ten błąd również z UIPanGestureRecognizer, kierunek nie działa w lewo/w prawo delegat powrót zawsze NIE, w niektórych rodzajach obrazów, nie mogę znaleźć wyjaśnienia (ale gdy zmienię metodę delegata na tę odpowiedź wszystko działa. ! –

+0

Niesamowita wskazówka! Spędź z tego kilka godzin! –

0

Dlaczego miałbyś zwrócić NO w rozpoznawaniu gestów tylko dlatego, że na gestRecognizerShouldBegin: ruch jest tylko pionowy? Ponieważ jest to gest wykonany przez użytkownika palcem (a nie przez maszynę), zawsze będzie jakiś losowość w jego ruchu z powodu niedokładności poruszającego się palca. gestRecognizerShouldBegin: zostanie wywołany zaraz po tym, jak użytkownik dotknie ekranu, a tłumaczenie, które otrzymasz, może wynosić zaledwie kilka pikseli. Twój program rozpoznający się nie powiedzie, jeśli użytkownik, tj. Gdy kładzie palec na ekranie, przesuwa go o 2 piksele w górę, nawet jeśli przesuwa go o 200 pikseli w prawo. Nie powinno to spowodować, że system rozpoznawania gestów zostanie trwale wyłączony, ale powinieneś również zajrzeć do niego, ponieważ może to wprowadzić w błąd użytkowników, gdy ich gesty nie zostaną rozpoznane z pozornie żadnego powodu.

Powiązane problemy