2011-09-07 22 views
5

Tôi có một câu hỏi có vẻ cơ bản nhưng không thể hiểu được.Phương pháp làm cho UIGestureRecognizer thất bại sau khi được nhận diện?

Câu hỏi cơ bản là: làm cách nào để đặt một trình nhận dạng gesturerecognizer thành trạng thái không thành công từ trình xử lý, trong khi nó nằm trong UIGestureRecognizerStateBegan hoặc UIGestureRecognizerStateChanged?

Giải thích chi tiết hơn: Tôi có trình nhận dạng cử chỉ báo chí dài cho UIView bên trong UIScrollView. Tôi đã thực hiện

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

vì khác tôi không thể xem cuộn để cuộn khi người dùng đặt ngón tay xuống ở chế độ xem. Đó là liên lạc cơ bản như safari, nơi bạn giữ ngón tay trên một liên kết, trong đó làm nổi bật liên kết, nhưng di chuyển lên hoặc xuống - sau đó liên kết là unhighlighted và scrollview di chuyển.

Tôi có thể thực hiện thao tác này ngay bây giờ vì cả hai cử chỉ đều được nhận diện, nhưng sẽ tốt hơn nếu tôi có thể phát hiện chuyển động trong StateChanged của gesturerecognizer, và nếu nó lớn hơn 20 pixel hoặc lâu hơn, chỉ cần lập trình thất bại lâu dài.

Điều này có thể thực hiện được không? Hay tôi đang đào tại một điểm sai?

Trả lời

4

Một câu hỏi mà tôi tìm thấy ngay sau khi tôi đăng các câu hỏi ..

Dưới đây là những gì tôi làm trong xử lý cử chỉ recognizer bây giờ:

else if (sender.state == UIGestureRecognizerStateChanged) { 
    CGPoint newTouchPoint = [sender locationInView:[self superview]]; 

    CGFloat dx = newTouchPoint.x - initTouchPoint.x; 
    CGFloat dy = newTouchPoint.y - initTouchPoint.y; 
    if (sqrt(dx*dx + dy*dy) > 25.0) { 
     sender.enabled = NO; 
     sender.enabled = YES; 
    } 
} 

Vì vậy, nếu ngón tay di chuyển hơn 25 pixel theo hướng nào , đặt thuộc tính được bật thành NO sẽ khiến trình nhận dạng không thành công. Vì vậy, điều này sẽ thực hiện những gì tôi muốn!

4

Nếu đó là UILongPressGestureRecognizer, chỉ cần đặt thuộc tính allowableMovement.

UILongPressGestureRecognizer* recognizer = [your recognizer]; 
recognizer.allowableMovement = 25.0f; 
1

Theo tài liệu bạn có thể phân lớp bạn cử chỉ recogniser:

Trong YourPanGestureRecognizer.m:

#import "YourPanGestureRecognizer.h" 

@implementation YourPanGestureRecognizer 

- (void) cancelGesture { 
    self.state=UIGestureRecognizerStateCancelled; 
} 

@end 

Trong YourPanGestureRecognizer.h:

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

@interface NPPanGestureRecognizer: UIPanGestureRecognizer 

- (void) cancelGesture; 

@end 

Bây giờ bạn có thể gọi nếu từ bất cứ nơi nào

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)]; 
[self.view addGestureRecognizer:panRecognizer]; 
[...] 
-(void) panMoved:(YourPanGestureRecognizer*)sender { 
    [sender cancelGesture]; // This will be called twice 
} 

Tham khảo: https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc

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