UIScrollview erhält Berührungsereignisse

Antworten:

180

Richten Sie eine Tippgestenerkennung ein:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[scrollView addGestureRecognizer:singleTap];    

und Sie werden die Berührungen bekommen in:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
    CGPoint touchPoint=[gesture locationInView:scrollView];
}
Suresh D.
quelle
6
Sie, mein Herr, sind ein Genie! Und all diese Beiträge über die Unterklasse von UIScrollView, pah!
Oliver Pearmain
1
Ich habe deinen Code verwendet. Aufgrund von UITapGestureRecognizer funktioniert der Klick auf die Bildlaufansicht jedoch nicht.
Ankur
2
@Hercules fügt den Controller als Delegaten zum Erkenner hinzu und verwendet diese Funktion: - (BOOL) gestureRecognizer: (UIGestureRecognizer *) gestureRecognizer shouldReceiveTouch: (UITouch *) touch {if ([touch.view isKindOfClass: [UIScrollView class]]) return YES; sonst NEIN zurückgeben; }
yuf
@yuf und Hercules, beachten Sie, dass iOS 5 und 6 derzeit unterscheiden, ob das contentOffset berechnet wird, bevor Sie eine Berührung erhalten. Apple hat beschlossen, dies zu ändern und den gesamten benutzerdefinierten Code zu brechen, wer weiß warum. 5 nicht, 6 nicht. Warum das !!? Argh. Sollte anderen Codierern helfen, ohne dass eine Taste ein Eingabeproblem empfängt.
Stephen J
Ziehen Sie in Xcode 5 IB (Interface Builder) das Objekt "Tap Gesture Recognizer" in ScrollView. Dann Control Drag von ScrollView zum Implementierungscode (* .m), um eine Tap-Gestenmethode hinzuzufügen.
David Douglas
6

Sie können Ihre eigene UIScrollview-Unterklasse erstellen und anschließend Folgendes implementieren:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

{

NSLog(@"DEBUG: Touches began" );

UITouch *touch = [[event allTouches] anyObject];

    [super touchesBegan:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {

    NSLog(@"DEBUG: Touches cancelled");

    // Will be called if something happens - like the phone rings

    UITouch *touch = [[event allTouches] anyObject];

    [super touchesCancelled:touches withEvent:event];

}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    NSLog(@"DEBUG: Touches moved" );

    UITouch *touch = [[event allTouches] anyObject];

    [super touchesMoved:touches withEvent:event];

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"DEBUG: Touches ending" );
    //Get all the touches.
    NSSet *allTouches = [event allTouches];

    //Number of touches on the screen
    switch ([allTouches count])
    {
        case 1:
        {
            //Get the first touch.
            UITouch *touch = [[allTouches allObjects] objectAtIndex:0];

            switch([touch tapCount])
            {
                case 1://Single tap

                    break;
                case 2://Double tap.

                    break;
            }
        }
            break;
    }
    [super touchesEnded:touches withEvent:event];
}
Vicky
quelle
1

Wenn wir über die Punkte in der Bildlaufansicht sprechen, können Sie die Delegate-Methode verwenden:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

und lesen Sie innerhalb der Methode die Eigenschaft:

@property(nonatomic) CGPoint contentOffset

aus der scrollView, um die Koordination zu erhalten.

Nevin
quelle
2
Hallo, ich möchte keine Berührungen bekommen, wenn die Bildlaufansicht Ziehen, ich brauche wie TouchesBegan
0

Dies funktioniert auch bei Touchdown-Ereignissen.

In der aktuell als korrekt markierten Antwort erhalten Sie eine touch pointnur bei einem "Tap" -Ereignis. Dieses Ereignis scheint nur auf "Finger hoch" und nicht auf "unten" zu feuern.

Aus dem Kommentar von yuf in der gleichen Antwort können Sie die touch pointaus der zugrunde liegenden Ansicht auch innerhalb der erhalten UIScrollView.

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch
{
  CGPoint touchPoint = [touch locationInView:self.view];

  return TRUE; // since we're only interested in the touchPoint
}

Laut Apples Dokumentation der gestureRecognizertut:

Fragen Sie den Delegierten, ob ein Gestenerkenner ein Objekt erhalten soll, das eine Berührung darstellt.

was für mich bedeutet, dass ich entscheiden kann, ob a gestureRecognizereine Berührung erhalten soll oder nicht.

Bruno Bieri
quelle