2011-09-20 11 views
11

Mój widok został dodany do UIPanGestureRecognizer.
Problem polega na tym, że do czasu, gdy dotyk zostanie rozpoznany jako gest panoramy, musi on zostać przesunięty o kilka punktów, a ja nie mogę wyodrębnić oryginalnej lokalizacji dotyku w stanie UIGestureRecognizerStateBegan. W tym stanie translationInView: jest (0,0), a wszelkie kolejne ruchy są obliczane od tego punktu, a nie od oryginału.Uzyskaj oryginalną lokalizację dotyku z UIPanGestureRecognizer

Czy istnieje sposób na wyodrębnienie oryginalnej lokalizacji z samego narzędzia do rozpoznawania gestów lub czy należy zastąpić metodę touchesBegan:?

+0

Ten link może pomóc - http://www.icodeblog.com/2010/10/14/working-with-uigesturerecognizers/ – Coffee

Odpowiedz

7

Powinieneś być w stanie ustawić delegate funkcji rozpoznawania gestów i wdrożenie

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

uzyskać wstępną dotyku.

+2

To działa też. Jednak na końcu użyłem 'touchesBegan:'. Wygląda na to, że narzędzie do rozpoznawania gestów nie ma pojęcia, gdzie początkowo miało miejsce wydarzenie dotykowe. – antalkerekes

1

Jeśli użyjesz locationInView: zamiast , otrzymasz bezwzględne współrzędne zamiast względnych współrzędnych. Jednak trzeba jednak zacząć patelnię, aby uzyskać wejście ... W celu obejścia tego widoku może być UIButton i można wyzwolić - (IBAction)buttonWasTouched:(UIButton *)button forEvent:(UIEvent *)event połączony "touch down" tak:

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

Można rozwiązać ten problem poprzez wdrożenie niestandardowy PanGestureRecognizer, który zapisuje oryginalny punkt dotyku i udostępnia go rozmówcy.

Poszedłem na tę trasę, ponieważ chciałem również kontrolować odległość przesuniętą, aby wywołać gest panoramy .

To może być przesada dla twojej sytuacji, ale działa idealnie i jest trudniejsze niż się wydaje.

Aby uzyskać styczności współrzędnych, wystarczy zadzwonić:

[sender touchPointInView:yourView] 

zamiast:

[sender locationInView:yourView] 

Oto kod dla 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

Nie rozumiem, jak należy tego użyć. –

0

Można użyć UIGestureRecognizerState

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

Swift (owski):

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

proszę podać jakieś wyjaśnienie dla swojej odpowiedzi .. – Lal

+0

Rozpoznawanie gestów ma różne stany (.Began, .Ended, .Cancelled, itp ...). Jeśli otrzymasz lokalizację (widok lub dotknięcie), gdy stan rozpoznania jest .Began będziesz miał swoją pierwszą lokalizację. – Aiden

+0

Umieść ten kod wewnątrz funkcji, która zostanie wywołana przez gest.Powyższa linia println wydrukuje tylko jedną parę współrzędnych na dotyk/pan. – Aiden

Powiązane problemy