2010-09-06 9 views
22

Ich versuche, linke/rechte Wischgeste in einem UIScrollView zu erkennen. Ich habe versucht, UISwipeGestureRecognizers zu erstellen und sie mit der Bildlaufansicht zu verknüpfen. Es funktioniert aber sehr selten. Die meiste Zeit werde ich nicht angerufen. Warum?So erkennen Sie die Wischgeste in UIScrollView

Wie kann ich zuverlässig nach links/rechts wischen? Kann ich die Geste Erkenner verwenden, oder muss ich es selbst in touchesBegan/Ended

Dank

Antwort

38

Figured es irgendwie umgehen aus. In meinem Fall enthielt mein UIScrollView ein UII-Bild, das ich zoomen durfte. Anscheinend bedeutete dies, dass das Scrollen aktiviert war und die UIScrollView Probleme hatte, zwischen Gesten zu unterscheiden, die zwischen Blättern und Streichen (nächstes, vorheriges Bild) blättern sollten.

Der Schlüssel in meinem Fall ist das Scrollen in der Bildlaufansicht zu deaktivieren, wenn das Bild nicht gezoomt wird, und es wieder zu aktivieren, wenn es vergrößert wird. Dies bietet das erwartete Verhalten.

Der kritische Teil ist die folgende in der Scroll-Ansicht der Delegierten zu setzen:

- (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; 
    } 
} 

Ich habe auch mit Scrollen deaktiviert die Scroll-Ansicht zu initialisieren. Zoomen zu aktivieren, einfach ein Bild bieten auf einen Delegierten Anruf,

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

Und ein paar parms in viewDidLoad für die Zoom- und Setup-Geste Erkenner gesetzt sowie

- (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

wirklich hervorragend finden David. Meine Swipe-Recognizer funktionierten ebenfalls nicht. Ich gab auf und benutzte touchesBegan: mit NSNotification, aber es gab auch eine Benachrichtigung für MasterViewControllers (auf dem iPad). Ich war verschwommen und suchte nach diesem Problem. Du hast meine Zeit und Energie gespart !! Herzlichen Dank David. Mach weiter Tricks .. hab einen schönen Tag. – gopikrishnan

+0

Danke für den Trick – iOSAppDev

+0

Oder vielleicht in einer Zeile - scrollView.scrollEnabled = (scale! = 1.0f) – Yariv

4

guter Beitrag.

Ich machte eine ähnliche Sache (keine Bildansicht) und ich musste im Grunde Scrollen deaktivieren, wenn die contentSize kleiner als die Höhe war (meine Bildlaufansicht scrollt nur vertikal).

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

, die den Trick

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

Die richtige Lösung für mich getan hat, dieses Problem zu beheben, ist eine Zeile Code hinzuzufügen:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe] 

Swift Version:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe) 
+0

Definitiv zustimmen, dass dies die richtige Lösung ist! Ich muss auch in der gleichen Zeile für den "pinchGestureRecognizer" hinzufügen, um es zuverlässig zu bekommen, da ich versuchte, einen Mehrfinger-Swipe zu erkennen. –

+0

Das scheint definitiv der richtige Weg zu sein! Manchmal finde ich, dass die Wischgeste etwas zu früh ausgelöst wird, aber das ist jetzt ein Problem mit dem Swipe-Handler. Zumindest müssen wir nicht alle Arten von seltsamen hacky Sachen machen, die andere Leute vorschlagen, und nur "sich falsch fühlen". Vielen Dank!! – horseshoe7

+1

tolle Antwort aller Zeiten .. :) –

Verwandte Themen