2011-09-20 30 views
11

Chế độ xem của tôi đã thêm UIPanGestureRecognizer vào đó.
Vấn đề là do thời gian chạm được nhận dạng là cử chỉ di chuyển, nó phải được di chuyển một vài điểm và tôi không thể trích xuất vị trí cảm ứng ban đầu ở trạng thái UIGestureRecognizerStateBegan. Trong trạng thái này, translationInView: là (0,0), và bất kỳ chuyển động tiếp theo nào được tính từ thời điểm này, chứ không phải từ bản gốc.Nhận vị trí chạm ban đầu từ UIPanGestureRecognizer

Có cách nào để trích xuất vị trí ban đầu từ trình nhận dạng cử chỉ hay không, hoặc tôi có cần ghi đè phương thức touchesBegan: không?

+0

Liên kết này có thể giúp - http://www.icodeblog.com/2010/10/14/working-with-uigesturerecognizers/ – Coffee

Trả lời

7

Bạn sẽ có thể thiết lập các delegate cho recogniser cử chỉ và thực hiện

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

để có được các liên lạc ban đầu.

+2

này hoạt động, quá. Tuy nhiên, cuối cùng tôi đã sử dụng 'touchesBegan:'. Dường như, công cụ nhận dạng cử chỉ thực sự không có đầu mối khi sự kiện cảm ứng bắt đầu. – antalkerekes

1

Nếu bạn sử dụng locationInView: thay vì translationInView: bạn sẽ nhận được tọa độ tuyệt đối thay vì tọa độ tương đối. Tuy nhiên bạn phải khởi động chảo để có được đầu vào ... Để làm việc xung quanh quan điểm này của bạn có thể là một UIButton và bạn có thể kích hoạt một - (IBAction)buttonWasTouched:(UIButton *)button forEvent:(UIEvent *)event kết nối với "touch down" như vậy:

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

Bạn có thể giải quyết vấn đề này bằng cách thực hiện tùy chỉnh PanGestureRecognizer giúp lưu điểm tiếp xúc ban đầu và cung cấp cho người gọi.

Tôi đã đi tuyến đường này vì tôi cũng muốn kiểm soát khoảng cách được di chuyển để kích hoạt cử chỉ xoay .

Điều này có thể quá mức cần thiết cho hoàn cảnh của bạn, nhưng hoạt động hoàn hảo và ít khó hơn âm thanh.

Để có được tọa độ điểm tương tác, bạn chỉ cần gọi:

[sender touchPointInView:yourView] 

thay vì:

[sender locationInView:yourView] 

Dưới đây là các mã cho 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

Tôi không hiểu làm thế nào người ta nên sử dụng điều này. –

0

Bạn có thể sử dụng 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

vui lòng cung cấp một số loại giải thích cho câu trả lời của bạn .. – Lal

+0

Trình nhận cử chỉ có các trạng thái khác nhau (.Began, .Ended, .Cancelled, etc ...). Nếu bạn nhận được vị trí của (xem hoặc chạm) khi trạng thái nhận dạng là .Ban đầu bạn sẽ có vị trí đầu tiên. – Aiden

+0

Đặt mã này bên trong hàm được gọi bằng cử chỉ.Dòng println ở trên sẽ chỉ in một cặp tọa độ cho mỗi lần chạm/pan – Aiden

Các vấn đề liên quan