2010-09-06 12 views
22

Próbuję rozpoznać gest przesunięcia w lewo/w prawo w UIScrollView. Próbowałem utworzyć UISwipeGestureRecognizers i skojarzyć je z widokiem przewijania. Działa, ale bardzo rzadko. Przez większość czasu nie jestem wezwany. Czemu?Jak rozpoznać gest machnięcia w UIScrollView

Jak mogę niezawodnie przesuwać w lewo/w prawo do pracy? Czy mogę korzystać z rozpoznawania, czyli recognizers gest czy muszę jakoś poradzić sobie w touchesBegan/Ended

Dzięki

Odpowiedz

38

Zdobione. W moim przypadku mój UIScrollView zawierał UIImage, któremu pozwoliłem na powiększanie. Najwyraźniej oznaczało to, że przewijanie jest włączone, a UIScrollView miał problem z rozróżnieniem gestów przewijania i przesunięcia (następny, poprzedni obraz).

Kluczem w moim przypadku jest wyłączenie przewijania w widoku przewijania, gdy obraz nie jest powiększony, i zmiana jego położenia, gdy jest on powiększony. Zapewnia to oczekiwane zachowanie.

Krytyczna kawałek jest wprowadzenie następujących w delegata widoku zwoju:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (scrollView.zoomScale!=1.0) { 
    // Zooming, enable scrolling 
    scrollView.scrollEnabled = TRUE; 
    } else { 
    // Not zoomed, disable scrolling so gestures get used instead 
    scrollView.scrollEnabled = FALSE; 
    } 
} 

Mam również zainicjować pogląd przewijania z przewijania wyłączone. Aby włączyć powiększanie, po prostu dostarczyć obraz na rozmowy delegata

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    // Return the scroll view 
    return myImage; 
} 

i ustawić kilka PARMS w viewDidLoad dla powiększania i gest setup Recognizers także

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height); 
    myScrollView.maximumZoomScale = 4.0; 
    myScrollView.minimumZoomScale = 1.0; 
    myScrollView.clipsToBounds = YES; 
    myScrollView.delegate = self; 

    [myScrollView addSubview:myImage]; 
    [self setWantsFullScreenLayout:TRUE]; 

    myScrollView.scrollEnabled = FALSE; 
    UISwipeGestureRecognizer *recognizer = 
    [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    recognizer.delaysTouchesBegan = TRUE; 
    [myScrollView addGestureRecognizer:recognizer]; 
    [recognizer release]; 

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    recognizer.direction = UISwipeGestureRecognizerDirectionLeft; 
    [myScrollView addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    [myScrollView delaysContentTouches]; 
} 
+0

Naprawdę doskonałe znalezisko Davida. moje narzędzia do rozpoznawania przeciągnięć również nie działały.i zrezygnowałem i użyłem touchBegan: z NSNotification, ale dało to powiadomienie dla MasterViewControllers również (na iPadzie) .i było zamglone, szukając tego problemu. Uratowałeś mój czas na energię! serdeczne dzięki David. Wysyłajcie posty ... Miłego dnia. – gopikrishnan

+0

Dzięki za podstęp – iOSAppDev

+0

A może w jednym wierszu - scrollView.scrollEnabled = (skala! = 1.0f) – Yariv

4

dobra wiadomość.

Robiłem coś podobnego (bez widoku obrazu) i zasadniczo musiałem wyłączyć przewijanie, jeśli contentSize był mniejszy niż wysokość (mój widok przewijania przewija się tylko w pionie).

if (scrollView.contentSize.height>scrollView.frame.size.height) { 
    scrollView.scrollEnabled = YES; 
} 
else { 
    scrollView.scrollEnabled = NO; 
} 

To załatwiło sprawę dla mnie

24
UIScrollView *scrollView = ... 
UISwipeGestureRecognizer *mySwipe = ... 

właściwe rozwiązanie, aby rozwiązać ten problem jest dodanie jednej linii kodu:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe] 

wersję SWIFT:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe) 
+0

Zdecydowanie zgadzam się, że to jest poprawne rozwiązanie! Muszę również dodać w tej samej linii dla 'pinchGestureRecognizer', aby uzyskać wiarygodność, ponieważ próbowałem wykryć przesunięcie palcem z wieloma palcami. –

+0

To zdecydowanie wydaje się być właściwą drogą! Czasami wydaje mi się, że gest machnięcia jest zbyt krótki, ale teraz jest to problem z obsługą przeciągnięcia. Przynajmniej nie musimy robić wszelkiego rodzaju dziwnych, hackowatych rzeczy, które sugerują inni ludzie, i po prostu "źle się czuć". Dzięki!! – horseshoe7

+1

świetna odpowiedź wszech czasów .. :) –

Powiązane problemy