2011-09-20 6 views
11

La vista personale è stata aggiunta a UIPanGestureRecognizer.
Il problema è che quando il tocco viene riconosciuto come un gesto di panoramica, deve essere spostato di alcuni punti e non è possibile estrarre la posizione di tocco originale allo stato UIGestureRecognizerStateBegan. In questo stato translationInView: è (0,0) e qualsiasi spostamento successivo viene calcolato da questo punto e non dall'originale.Ottieni la posizione di tocco originale da UIPanGestureRecognizer

Esiste un modo per estrarre la posizione originale dal rilevatore di gesti stesso oppure è necessario sovrascrivere il metodo touchesBegan:?

+0

Questo collegamento può aiutare - http://www.icodeblog.com/2010/10/14/working-with-uigesturerecognizers/ – Coffee

risposta

7

Si dovrebbe essere in grado di impostare il delegate per il riconoscitore gesto e implementare

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

per ottenere il contatto iniziale.

+2

Questo funziona, anche. Tuttavia, alla fine ho usato "touchesBegan:". Sembra che il riconoscitore di pan gesture in realtà non abbia la minima idea di dove l'evento touch sia originariamente iniziato. – antalkerekes

1

Se si utilizza locationInView: anziché translationInView:, si ottengono le coordinate assolute invece delle coordinate relative. Tuttavia si ha a iniziare la padella per ricevere input ... Per ovviare a questo la visualizzazione può essere un UIButton e si può innescare un - (IBAction)buttonWasTouched:(UIButton *)button forEvent:(UIEvent *)event collegato a "touch down" in questo modo:

-(IBAction)shakeIntensityPanGesturebuttonWasTouched:(UIButton *)button forEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; //touch location local cordinates 
} 
3

è possibile risolvere questo problema mediante l'attuazione di un numero personalizzato PanGestureRecognizer che salva il punto di contatto originale e lo rende disponibile per il chiamante.

Sono andato su questa strada perché volevo anche controllare la distanza spostata per attivare un gesto pan .

Questo potrebbe essere eccessivo per la situazione, ma funziona perfettamente ed è meno difficile di quanto sembri.

Per ottenere le coordinate touchpoint, basta chiamare:

[sender touchPointInView:yourView] 

invece di:

[sender locationInView:yourView] 

Ecco il codice per PanGestureRecognizer.m:

#import "PanGestureRecognizer.h" 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@implementation PanGestureRecognizer 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    UITouch *touch = [touches anyObject]; 

    // touchPoint is defined as: @property (assign,nonatomic) CGPoint touchPoint; 

    self.touchPoint = [touch locationInView:nil]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:nil]; 

    // customize the pan distance threshold 

    CGFloat dx = fabs(p.x-self.touchPoint.x); 
    CGFloat dy = fabs(p.y-self.touchPoint.y); 

    if (dx > 2 || dy > 2) { 
     if (self.state == UIGestureRecognizerStatePossible) { 
      [self setState:UIGestureRecognizerStateBegan]; 
     } 
     else { 
      [self setState:UIGestureRecognizerStateChanged]; 
     } 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 

    if (self.state == UIGestureRecognizerStateChanged) { 
     [self setState:UIGestureRecognizerStateEnded]; 
    } 
    else { 
     [self setState:UIGestureRecognizerStateCancelled]; 
    } 
} 

- (void) reset 
{ 
} 

// this returns the original touch point 

- (CGPoint) touchPointInView:(UIView *)view 
{ 
    CGPoint p = [view convertPoint:self.touchPoint fromView:nil]; 

    return p; 
} 

@end 
+0

Non capisco come si dovrebbe usare questo. –

0

È possibile utilizzare il UIGestureRecognizerState

- (void) onPanGesture:(UIPanGestureRecognizer *)sender { 
    if(sender.state == UIGestureRecognizerStateBegan) { 
     origin = [sender locationInView]; 
    } else { 
     current = [sender locationInView]; 
     // Initial touch stored in origin 
    } 
} 

Swift (ish):

var state = recognizer.state 
if state == UIGestureRecognizerState.Began { 
    println(recognizer.locationInView(viewForGesture)) 
    //this will be the point of first touch 
} 
+0

si prega di fornire qualche tipo di spiegazione per la risposta .. – Lal

+0

I riconoscimenti di gesti hanno stati diversi (.Began, .Ended, .Cancelled, ecc ...). Se si ottiene la posizione di (visualizzazione o tocco) quando lo stato del riconoscimento è. Avviato si avrà la sua prima posizione. – Aiden

+0

Inserisci questo codice all'interno della funzione che viene chiamata dal gesto.La linea di stampa sopra stamperà solo una coppia di coordinate per touch/pan – Aiden