2012-03-15 11 views
15

Tôi đang xây dựng một ứng dụng iPhone cho phép người dùng sắp xếp lại một số thành phần giao diện người dùng trên màn hình.iPhone iOS cách thêm UILongPressGestureRecognizer và UITapGestureRecognizer vào cùng một điều khiển và ngăn chặn xung đột?

Làm cách nào để thêm trình nhận dạng cử chỉ nhấn và trình nhận dạng cử chỉ báo chí dài cho cùng một UIView? Khi tôi nhấc ngón tay lên từ báo chí dài, bộ nhận dạng cử chỉ nhấn sẽ kích hoạt. Làm cách nào để tạm thời vô hiệu hóa trình nhận dạng cử chỉ nhấn hoặc ngăn không cho trình kích hoạt kích hoạt khi người dùng đang thực hiện báo chí dài?

Cảm ơn bạn!

Trả lời

46

Để cho phép cả hai cử chỉ để làm việc cùng nhau, thực hiện các phương pháp đại biểu sau đây:

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

Để làm cho nó để báo chí dài có ưu tiên hàng đầu, làm:

[tapGesture requireGestureRecognizerToFail:longPress];

+0

Mũ tắt. câu trả lời hay. –

+0

hat off quá. dòng cuối cùng của mã này là những gì tôi cần. – dellos

0

Bạn có thể quản lý nó trong mã, trong suốt thời gian báo chí dài, đặt cờ và nếu nhấn được gọi trong khi cờ là đúng hoặc bất kỳ điều gì sau đó không thực thi mã chạm và đặt lại cờ. Tôi không biết một cách tốt hơn

7

là một cách tiếp cận khác, không có hai recognisers riêng biệt - chỉ cần sử dụng recogniser nhấn và giữ cho cả hai sự kiện:

Cấu hình như sau:

UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)]; 
    categoryPanelDrag.minimumPressDuration = 0.0; 

Sau đó xử lý như sau:

- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture { 

    // _dragStarted is a class-level BOOL 

    if(UIGestureRecognizerStateBegan == gesture.state) { 
     _dragStarted = NO; 
    } 

    if(UIGestureRecognizerStateChanged == gesture.state) { 
     _dragStarted = YES; 
     // Do dragging stuff here 
    } 

    if(UIGestureRecognizerStateEnded == gesture.state) { 

     if (_dragStarted == NO) 
     { 
      // Do tap stuff here 

     } 
     else 
     { 
      // Do drag ended stuff here 
     } 
    } 

    return YES; 

} 
+0

Điều này không hoạt động – Softlion

+1

@Softlion đừng quên giao diện UIGestureRecognizerDelegate trên.h file :-) –

+0

Vâng nó biên dịch và chạy, nhưng không ngăn chặn xung đột. Tôi đã giải quyết vấn đề bằng cách sử dụng 2 trình nhận dạng và gestureRecognizer (_: shouldRecognizeSimultaneouslyWithGestureRecognizer :) – Softlion

1

tôi đã làm thử Moby và cách tiếp cận thợ nhưng bằng cách nào đó họ không phù hợp với dự án của tôi tốt, vì vậy tôi giải quyết như dưới đây,

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    NSLog(@"%@ %ld",touch.description, touch.phase); 
    [self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5]; 
    return YES; 
} 

- (void)checkTouch:(UITouch *)touch{ 
    NSLog(@"touch phase = %ld",touch.phase); 
    if (touch.phase == UITouchPhaseStationary) { 
     //still holding my hand and this means I wanted longPressTouch 
    } 
    if (touch.phase == UITouchPhaseEnded){ 
     //I released my finger so it's obviously tap 
    } 
} 

Có thể là giải pháp đơn giản hơn nhưng tất nhiên nó phụ thuộc vào dự án.

9

Để kết hợp thành công cả hai bạn cần:

1º Thêm vào giao diện cử chỉ đại biểu tại tiêu đề

@interface ViewController : ViewController <UIGestureRecognizerDelegate> 

2º Tạo sự kiện cử chỉ và thêm vào một cái nhìn vào tập tin nguồn:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch:)]; 
    [tap setNumberOfTapsRequired:1]; // Set your own number here 
    [tap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol 

    UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTouch:)]; 
    [longTap setNumberOfTapsRequired:0]; // Set your own number here 
    [longTap setMinimumPressDuration:1.0]; 
    [longTap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol 
    [tap requireGestureRecognizerToFail:longTap]; // Priority long 

    [self.view addGestureRecognizer:tap]; 
    [self.view addGestureRecognizer:longTap]; 

3º Thêm gọi lại trong tệp nguồn:

- (void) touch: (UITapGestureRecognizer *)recognizer 
{ 
    CGPoint location = [recognizer locationInView: self.HUDview]; 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"touch UIGestureRecognizerStateBegan"); 
    } 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"touch UIGestureRecognizerStateEnded"); 
     //NSLog(@"Position of touch: %.3f, %.3f", location.x, location.y); // Position landscape 
    } 
} 

- (void) longTouch: (UILongPressGestureRecognizer *)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"longTouch UIGestureRecognizerStateBegan"); 
    } 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"longTouch UIGestureRecognizerStateEnded"); 
    } 
} 

4º Đặt trình nhận dạng cử chỉ có sẵn:

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