2010-04-13 39 views
24

Tôi cần phải nắm bắt hai cử chỉ chuyển đổi khác nhau bằng cách sử dụng UISwipeGestureRecognizer (ví dụ: UISwipeGestureRecognizerDirectionRightUISwipeGestureRecognizerDirectionLeft). Khi tôi thêm hai trình nhận dạng khác nhau với phương thức phương thức addGestureRecognizer, chỉ công cụ nhận dạng được thêm mới nhất hoạt động. Tôi đã đọc rằng tôi cần triển khai gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: phương thức của giao thức UIGestureRecognizerDelegate, nhưng không có gì hoạt động.Trình nhận dạng cử chỉ đồng thời trong SDK SDK

Có ai có thể giúp bạn với ví dụ đơn giản về việc bắt hai hoặc nhiều cử chỉ giống nhau không? Cảm ơn!

Trả lời

33

Thật dễ dàng:

Lúc đầu chúng ta nên tạo đẳng cấp, mà thực hiện UIGestureRecognizerDelegate giao thức:

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate> 
 

@implementation MyGestureDelegate 

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

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

Và sử dụng nó như thế này:

 

    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSwipeGestureLeft:)]; 
    [self.view addGestureRecognizer:swipeGestureLeft]; 
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [swipeGestureLeft release]; 

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleSwipeGesture:)]; 
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; 
    [self.view addGestureRecognizer:swipeGesture]; 

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init]; 

    [swipeGesture setDelegate:deleg]; 
    [swipeGesture release]; 

+1

Thx. Chỉ cần sử dụng điều này để có được UIPanGestureRecognizer và UIPinchGestureRecognizer để làm việc cùng nhau trên cùng một giao diện. – Hafthor

+1

để triển khai UIGestureRecognizerDelegate trong mã ở trên sử dụng mã này @interface MyGestureDelegate: NSObject ps. Cảm ơn bạn cho các tip ... –

+0

Tôi không nhận được nó: là nó chính xác rằng chỉ có một trong hai Recognizers được giao một đại biểu? – Sjakelien

1

Tôi khuyên bạn nên đọc một chút về kỹ thuật mà trình nhận dạng cử chỉ sử dụng để nhận biết cử chỉ. Tôi cho rằng, người nhận dạng đầu tiên cố gắng nhận ra cử chỉ, nhưng nhận ra rằng anh ta không phải trả lời nó và rồi bằng cách nào đó anh ta không vượt qua nó.

Rất hữu ích khi đọc cách chúng hoạt động để hiểu cách sử dụng chúng.

Hy vọng điều này sẽ hữu ích.

+0

Tôi nghĩ vậy và có thông tin như vậy trên developer.apple.com: "Theo mặc định, không có hai người nhận dạng cử chỉ nào có thể cố gắng nhận ra cử chỉ của họ cùng một lúc. Nhưng bạn có thể thay đổi hành vi này bằng cách triển khai gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer :, an Phương pháp này được gọi khi nhận dạng nhận dạng cử chỉ nhận sẽ chặn hoạt động của trình nhận dạng cử chỉ được chỉ định hoặc ngược lại. Trả về CÓ để cho phép cả hai trình nhận dạng cử chỉ nhận ra cử chỉ của chúng đồng thời. " – user294890

2

Um, xem nhanh tài liệu sẽ tiết lộ rằng bạn đang làm nhiều việc hơn bạn cần:

"direction Chỉ đường được phép vuốt.

@property(nonatomic) UISwipeGestureRecognizerDirection direction 

Thảo luận Bạn có thể chỉ định nhiều hướng bằng cách xác định nhiều UISwipeGestureRecognizerDirection hằng sử dụng Bitwise-OR toán hạng. Hướng mặc định là UISwipeGestureRecognizerDirectionRight "

Đó là để nói, thay vì sử dụng hai UISwipeGestureRecognizers, bạn chỉ có thể làm như sau:.

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
             initWithTarget:self action:@selector(handleSwipeGesture:)]; 

swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft; 

Và trong phương pháp hành động của bạn:

-(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender 
    { 
    if (sender.direction == UISwipeGestureRecognizerDirectionLeft) { 

     //do left action 

    } else { 

     //do right action 

    } 
} 

nhiều

+1

Người nhận xét bên dưới là chính xác. Điều này sẽ không hoạt động như được quảng cáo. Tôi nên kiểm tra công việc của mình cẩn thận hơn! Tôi đổ lỗi cho pháo sáng mặt trời đập ra sóng não của tôi ... Vâng, đó là nó, pháo sáng mặt trời ... hoặc một cái gì đó ... – Phoenix

20

Câu trả lời: "Um, xem nhanh tài liệu ..." từ Phoenix abso lutely sẽ không hoạt động!

Anh ấy đang đặt mặt nạ, sau đó sử dụng cùng một biến để kiểm tra như thể trình nhận dạng đã xóa nó và đặt một bit.Nó lưu trữ, khi ông trích dẫn một cách chính xác từ các tài liệu:

Các hướng phép của swipe

sender.direction 

sẽ chỉ đơn giản là trả lại mặt nạ bạn thiết lập ban đầu và trong ví dụ của mình, sẽ không bao giờ giải quyết cho một hướng duy nhất!

UISwipeGestureRecognizerDirectionRight == 1 
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3 

Additionaly, đối với hầu hết trường hợp, bạn không cần phải:

  • thiết lập một đại biểu
  • giấy phép công nhận cử chỉ cùng lúc (trừ khi bạn muốn thao tác vuốt đồng thời, không có khả năng)
  • gửi trình nhận dạng cho công cụ chọn

Các công trình sau đây cho tôi:

UISwipeGestureRecognizer* swipe; 

    swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease]; 
    swipe.direction = UISwipeGestureRecognizerDirectionLeft; 
    [view addGestureRecognizer:swipe]; 

    swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease]; 
    swipe.direction = UISwipeGestureRecognizerDirectionRight; // default 
    [view addGestureRecognizer:swipe]; 
+0

Yup, thực hiện hướng cử chỉ riêng và gán chúng cho các phương pháp riêng biệt hoạt động tốt cho tôi. Kinda ngu ngốc mặc dù, nhưng hoạt động. – GeneCode

+0

Câu trả lời này giải quyết được vấn đề của tôi, mặc dù tôi cảm thấy câu trả lời của Phoenix NÊN làm việc. Ngu ngốc là không. – RyJ

0

Nhờ đề xuất của người dùng294890, tôi đã thành công bằng cách trả lại có từ các phương pháp được liệt kê UIGestureRecognizerDelegate.

Tuy nhiên, tôi thấy rằng nó sẽ không hoạt động khi tôi thêm GestureRecognizer trước khi chế độ xem web đã được tải. Tuy nhiên nó đã hoạt động khi tôi thêm GestureRecognizer vào webView trong phương thức ủy quyền webView:

- (void)webViewDidFinishLoad:(UIWebView *)webView.

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