2010-10-14 19 views
45

Tôi có một số UIPanGestureRecognizer Tôi đang sử dụng để theo dõi một đối tượng (UIImageView) bên dưới ngón tay của người dùng. Tôi chỉ quan tâm đến chuyển động trên trục X, và nếu cảm ứng nằm trên hoặc dưới khung của đối tượng trên trục Y tôi muốn kết thúc chạm.Làm cách nào tôi có thể yêu cầu một Trình nhận dạng UIGestureRecognizer hủy một liên lạc hiện có?

Tôi có mọi thứ tôi cần để xác định xem một chạm có nằm trong giới hạn Y của đối tượng hay không, nhưng tôi không biết cách hủy sự kiện chạm. Lật thuộc tính cancelsTouchesInView của người nhận dạng dường như không làm những gì tôi muốn.

Cảm ơn!

Trả lời

139

Bí quyết nhỏ này phù hợp với tôi.

@implementation UIGestureRecognizer (Cancel) 

- (void)cancel { 
    self.enabled = NO; 
    self.enabled = YES; 
} 

@end 

Từ các tài liệu UIGestureRecognizer @enabled:

Vô hiệu hóa một recognizers cử chỉ để nó không nhận được chạm. Giá trị mặc định là CÓ. Nếu bạn thay đổi thuộc tính thành NO này trong khi cử chỉ trình nhận dạng hiện đang nhận dạng cử chỉ , trình nhận dạng cử chỉ chuyển sang trạng thái bị hủy.

+2

OP dường như được hỏi về việc hủy một cá nhân chạm vào cử chỉ, không giết toàn bộ cử chỉ. –

+0

Giải pháp tối thiểu tuyệt đẹp –

+1

Kỹ thuật này được đề xuất trong [WWDC 2014 Phiên 235: Cuộn nâng cao và Kỹ thuật xử lý cảm ứng] (https://developer.apple.com/videos/wwdc/2014/?id=235). –

1

Bạn có một vài cách xử lý này:

  1. Nếu bạn đang viết một tùy chỉnh chảo cử chỉ nhận dạng lớp con, bạn có thể dễ dàng làm điều này bằng cách gọi -ignoreTouch:withEvent: từ bên trong nhận dạng khi bạn nhận thấy nó đi lạc từ khu vực bạn quan tâm.

  2. Vì bạn đang sử dụng trình nhận dạng Pan chuẩn và chạm vào bắt đầu tắt OK (vì vậy bạn không muốn ngăn chặn chức năng ủy nhiệm), bạn thực sự chỉ có thể phân biệt khi bạn nhận được hành động mục tiêu của người nhận dạng. Kiểm tra giá trị Y của các giá trị trả về translationInView: hoặc locationInView: và kẹp giá trị đó một cách thích hợp.

+2

câu hỏi là làm cách nào bạn bỏ qua trình nhận dạng và chuyển các sự kiện liên lạc cho người khác trong hành động của mình? – Jack

3

Làm thế nào về vấn đề này từ apple docs:

@property(nonatomic, getter=isEnabled) BOOL enabled 

Vô hiệu hóa một recognizers cử chỉ vì vậy nó không nhận được chạm. Giá trị mặc định là có. Nếu bạn thay đổi thuộc tính này thành NO trong khi trình nhận dạng cử chỉ hiện đang nhận dạng cử chỉ, trình nhận dạng cử chỉ sẽ chuyển sang trạng thái bị hủy.

8

câu trả lời của @ matej trong Swift.

extension UIGestureRecognizer { 
    func cancel() { 
    isEnabled = false 
    isEnabled = true 
    } 
} 
5

obj-C:

recognizer.enabled = NO; 
recognizer.enabled = YES; 

Swift 3:

recognizer.isEnabled = false 
recognizer.isEnabled = true 
0

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

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 từ bất cứ đâu nếu

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

Ref: https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc

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