2012-03-13 16 views
6

Tôi đang sử dụng lớp UILongPressGestureRecognizer để xử lý nếu một mục đang được chọn.UILongPressGestureRecognizer ngừng xử lý mà không cần dừng lại chạm vào

Logic như sau: Báo chí người dùng trong 1 giây một mục (lớp con UIView). Khi cử chỉ được phát hiện, mục được tô sáng và di chuyển.

Người dùng phải di chuyển mục này trên màn hình mà không cần dừng chạm vào nó.

Sự cố tôi đang gặp phải là cử chỉ được nhận dạng của cử chỉ bóngBan/Di chuyển/Đã kết thúc cần thiết cho hạng mục để sắp xếp chuyển động.

Tôi đã cố gắng xóa cử chỉ được nhận diện một lần được phát hiện và mục được chọn. Nhưng vẫn gửi tin nhắn đến tay cầm của cử chỉ thay vì phương thức chạm cuộc gọi.

Bất cứ ai biết cách nào để dừng "nghe" trình nhận dạng cử chỉ mà không để lại ngón tay của màn hình?

Cảm ơn.

Đây mã:

-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [self removeGestureRecognizer:[self.gestureRecognizers objectAtIndex:0]]; 

     NSLog(@"Long press detected."); 
    } 
} 

Như bạn có thể thấy trong các chi nhánh khác các đại biểu kêu gọi cho phép tất cả các thủ tục để đánh dấu mục này theo sự lựa chọn, và chỉ sau khi loại bỏ bên nhận.

Tôi đang thiếu gì?

--EDIT--

Xong! Công trình này:

#pragma mark Gesture Functions 
-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     NSLog(@"Long press detected."); 

     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [sender removeTarget:self action:@selector(handleLongPress:)]; 
     sender.enabled = NO; 
     [self removeGestureRecognizer:sender]; 



    } 
} 

Kính trọng!

Trả lời

1

Có hai giải pháp trong đầu tôi.

  1. Để tạo hoạt ảnh uiview, vui lòng viết một lớp mới được kế thừa từ lớp UIView và thực hiện các đại biểu cảm ứng thay vì viết các hướng dẫn để xử lý hoạt ảnh (nếu đại biểu cảm ứng không kích hoạt trong lớp hiện tại).

2.Tôi đã loại bỏ thành công UILongPressGestureRecognizer sau khi kích hoạt nó một lần.

Vui lòng tham khảo đoạn code dưới đây .ask tôi nếu bạn có bất cứ thắc mắc

bước tôi đã Xong

Tôi đã thêm một UIView là "MyView" to main-quan điểm của tôi khi chính-view tải .

Tôi đã cung cấp Thẻ cho myView (bạn có thể cung cấp 1,2,3… vv) để phân biệt chế độ xem được nhấn từ các chế độ xem chính.

Đã gán cử chỉ UILongPressGestureRecognizer cho myView và được chỉ định làm phương thức "moveMe".

Khi người dùng Nhấn myView lâu, phương thức "moveMe" sẽ kích hoạt.

Sau đó, tôi lặp subviews với điều kiện Tag == 1

Tôi đã gỡ bỏ các UILongPressGestureRecognizer từ subview.As mainView chúng ta có thể biết rằng Tagged 1 chính-view subview là MyView.

Vì vậy, NSLog (@ "cử chỉ bị xóa"); và NSLog (@ "moveMe"); sẽ chỉ đăng nhập vào giao diện điều khiển cùng một lúc.

NSLog (@ "touchesBegan"); sẽ kích hoạt đầu tiên thay vì kích hoạt phương thức "moveMe".

Sau đó, NSLog (@ "touchesBegan"); sẽ kích hoạt luôn sau khi xóa cử chỉ. "moveMe" phương pháp sẽ không kích hoạt bao giờ hết.

- (void)viewDidLoad {  
     //Adding to UIView to main view when application is loading. 
     UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 80, 80)];   
     myView.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 
      myView.tag = 1; //adding a tag to identify it. 
     //Adding Long Press Gesture to the UIView. 
     UILongPressGestureRecognizer *myGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveMe:)]; 
     [myView addGestureRecognizer:myGesture]; 
     [myGesture release]; 
     myGesture = nil; 
     [self.view addSubview:myView]; 
     [myView release]; 
     myView = nil;  
     [super viewDidLoad]; 
    }  

    //Method to trigger when user pressed long on the added UIView. 

-(void)moveMe:(id)sender 
{ 
     for (UIView *subViews in [self.view subviews]) 
     { 
      if (subViews.tag == 1) { 
       [subViews removeGestureRecognizer:sender]; 
       NSLog(@"gesture removed"); 
      }  
     }  
     NSLog(@"moveMe"); 
    }  
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touchesBegan"); 
} 

hoặc vui lòng tham khảo Disable gesture recognizer iOS

+0

hãy thử mô tả chi tiết câu hỏi của bạn –

+0

Tôi đã thử gửi để xóa phương thức người gửi làm thông số nhưng vẫn không hoạt động. – NemeSys

+0

tôi đã chỉnh sửa câu trả lời của mình ... –

4

Liệu các lớp UIView tùy chỉnh có mã xử lý hình cảm ứng riêng của mình? Nếu không, giải pháp đơn giản là đặt thuộc tính allowableMovement của UILongPressGestureRecognizer thành CGFLOAT_MAX hoặc một số lớn và sử dụng gọi lại cập nhật cử chỉ để kéo chế độ xem tùy chỉnh của bạn xung quanh. Bạn có thể chuyển vị trí bằng cách sử dụng phương thức - (CGPoint)locationInView:(UIView *)view trên màn hình giám sát và so sánh vị trí của nó khi trình nhận dạng bắt đầu.

+1

+1 Đây là giải pháp đơn giản nhất. Về cơ bản, 'Nếu bạn sử dụng trình nhận dạng cử chỉ thì hãy sử dụng trình nhận dạng cử chỉ'. – NJones

+1

Không cần thay đổi thuộc tính 'allowableMovement'; Nó chỉ được sử dụng để kiểm tra sự thất bại. Từ các chú thích trong 'UILongPressGestureRecognizer.h'" 'Chuyển động tối đa tính bằng pixel cho phép trước khi cử chỉ thất bại. Sau khi nhận ra (sau khi tối thiểuPressDuration) không có giới hạn chuyển động ngón tay cho phần còn lại của lần theo dõi cảm ứng" " – NJones

+0

Xin chào, cảm ơn câu trả lời . Lớp con UIView thực hiện touchesBegan/Moved/Ended để thao tác kích thước và vị trí trong superview của họ. Việc sử dụng các cử chỉ xuất phát từ nhu cầu làm cho ít nhạy cảm hơn khi chạm vào từng mục. Tại thời điểm này tôi đang sử dụng giải pháp vô hiệu hóa đối tượng nhận dạng cử chỉ và hoạt động như một sự quyến rũ. – NemeSys

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