2010-05-18 23 views
6

Tôi có UIView có UIPanGestureRecognizer đính kèm với nó cử chỉ hoạt động tốt ngoại trừ điểm bắt đầu không phải là nơi mà pan đầu tiên bắt đầu nó thường giảm 5 đến 15 pixel ở cả x và y tọa độ.Thật không may phương sai là không phù hợp và dường như liên quan đến tốc độ chuyển động panning diễn ra.Điểm khởi đầu của UIPanGestureRecognizer bị tắt

Để xác thực rằng các chạm được gửi chính xác, tôi đã thêm phương thức touchesBegan vào một chế độ xem phụ và nó nhận được điểm bắt đầu chính xác nhưng cử chỉ không cung cấp cùng một điểm trong giai đoạn bắt đầu. Một số ví dụ từ nhật ký của tôi bên dưới 'Điểm bắt đầu dòng' là điểm đầu tiên nhận được từ trình nhận dạng cử chỉ.

touchesBegan got point 617.000000x505.000000 
Line start point at 630.000000x504.0000001 
touchesBegan got point 403.000000x503.000000 
Line start point at 413.000000x504.000000 
touchesBegan got point 323.000000x562.000000 
Line start point at 341.000000x568.000000 

Có ai từng gặp vấn đề này trước đây không?

Bất kỳ ý tưởng nào về cách giải quyết vấn đề với việc phải triển khai Trình nhận dạng UIGestureRecognizer hoàn toàn mới?

Trả lời

2

documentation cho biết cử chỉ di chuyển bắt đầu khi các ngón tay "di chuyển đủ để được coi là chảo". Chuyển động này là để phân biệt một báo chí khỏi một kéo, vì ngón tay của người dùng có thể di chuyển xung quanh một chút trong khi họ đang cố gắng nhấn mà không cần kéo.

Tôi nghĩ đây là sự khác biệt mà bạn thấy giữa điểm tiếp xúc đầu tiên và điểm đầu tiên được coi là một phần của thao tác kéo.

+0

Sự cố xảy ra ngay cả khi bạn tạo cử chỉ của riêng mình tái nhận dạng bằng cách mở rộng UIGestureRecognizer, điểm bắt đầu khác với các phương thức touchesBegan. Tôi đã gửi một lỗi cho táo. –

+0

Hmm, tôi không chắc mình hiểu. Nếu bạn đang triển khai UIGestureRecognizer của riêng mình, bạn sẽ không định nghĩa điểm bắt đầu của riêng mình trong chạm vàoBài sao chưa? – Douglas

+0

@Douglas - Bạn đã bao giờ tìm được giải pháp cho điều này chưa? –

0

Để giải quyết vấn đề này, bạn có thể thử đặt lại điểm dịch khi trình nhận dạng cử chỉ bắt đầu. Ví dụ: bắt đầu phương pháp hành động của bạn như sau:

- (void)panGesture:(UIPanGestureRecognizer *)recognizer; 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     CGPoint point = ...; // The view's initial origin. 
     UIView *superview = [recognizer.view superview]; 
     [recognizer setTranslation:point inView:superview]; 
    } 
} 
2

Có sự khác biệt là do trình nhận dạng cử chỉ chờ khoảng cách chưa xác định trước khi hoạt động. Những gì bạn có thể làm là tạo UIPanGestureRecognizer của riêng bạn và đặt trạng thái thành UIGestureRecognizerStateChanged trong phương thức ghi đè touchesMoved.

LƯU Ý: Tôi đã sử dụng touhcesMoved thay vì chạm vàoBan bởi vì tôi muốn nó bắt đầu khi người dùng chạm vào được di chuyển và không ngay lập tức.

Dưới đây là một số mã ví dụ cho một nhận dạng cử chỉ tùy chỉnh mà thực hiện điều này:

#import "RAUIPanGestureRecognizer.h" 

@implementation RAUIPanGestureRecognizer 


#pragma mark - UIGestureRecognizerSubclass Methods 

- (void)reset 
    { [super reset ]; } 

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

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     [self setState:UIGestureRecognizerStateChanged ]; 
     [super touchesMoved:touches withEvent:event ]; 
    } 

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

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


@end 
+0

Làm việc như một say mê.Đừng quên #import ở đầu lớp thực hiện mặc dù – SarpErdag

3
CGPoint beg = [panRecognizer locationInView:_scrollView]; 
    CGPoint trans = [panRecognizer translationInView:_scrollView]; 
    CGPoint firstTouch = CGPointSubtract(beg, trans); 

Đặt mã này trong trường hợp UIGestureRecognizerStateBegan

6

Bạn có thể phát hiện vị trí cảm ứng ban đầu của một cử chỉ với phương thức ủy nhiệm của người nhận dạng cử chỉ

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

Tôi đã có vấn đề chính xác được mô tả bởi câu hỏi này, và điều này đã giúp tôi giải quyết nó đúng cách (IMHO). Điểm bắt đầu CGPoint = [touch locationInView: self]; // hoạt động bên trong phương thức ủy nhiệm –

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