2009-02-10 38 views
20

Tôi có chế độ xem UIImage phản hồi các sự kiện chạm. Tôi muốn hủy chuỗi cảm ứng, tức là, các cuộc gọi khác đến touchesMoved:, nếu chạm ngoài phạm vi nhất định. Làm thế nào tôi có thể làm điều đó?Làm thế nào để hủy bỏ một chuỗi các sự kiện UITouch?

Tôi biết rằng trong touchesMoved: Tôi có thể kiểm tra tọa độ của đối tượng cảm ứng và bỏ qua nó, nhưng những gì tôi không biết là làm thế nào để hủy bỏ hoàn toàn trình tự. Tôi không thấy bất kỳ phương pháp nào được ghi lại trong số Apple Developer UIResponder Reference mà tôi có thể gọi để hủy chuỗi liên lạc.

Trả lời

6

Giải pháp này có thể là một chút kludgy, nhưng bạn có thể thực hiện và tự gọi

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 

Tôi dựa giải pháp này một cách lỏng lẻo trên một số tinh chỉnh tôi đã làm cho ứng dụng mẫu MoveMe trên trang web iPhone sample code của Apple nơi tôi sửa đổi touchesMoved phương pháp giống như sau:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    if ([touch view] == placardView) 
     CGPoint location = [touch locationInView:self]; 
     placardView.center = location; 
     // I added the following line: 
     [self touchesCancelled:touches withEvent:event]; 
     return; 
} 
+1

Cảm ơn, tôi sẽ thử tính năng này khi tôi quay lại mac của mình. Nhưng điều này sẽ hủy bỏ các sự kiện chạm tiếp theo? Dường như với tôi rằng sau khi một cuộc gọi thủ công đến touchesCancelled, touchesMoved sẽ vẫn được gọi bởi hệ thống. –

+0

Trong giới hạn của mã mẫu MoveMe nó sẽ hủy bỏ liên lạc, nhưng tôi tin rằng bạn đúng, touchesMoved vẫn sẽ được gọi. Tôi càng nghĩ về nó càng ít thì tôi nghĩ touchesCancelled là cuộc gọi đúng. –

+0

Điều đó không có tác dụng và các sự kiện "di chuyển" tiếp tục đến sau đó. – Andy

2

Tôi đã gặp phải cùng một vấn đề gần đây và tìm cách tiêu chuẩn để giải quyết. Bạn có thể sử dụng [[UIApplication sharedApplication] startsIgnoringInteractionEvents] để ngừng phân phối các sự kiện chạm vào ứng dụng của bạn. Đảm bảo bật chúng bằng [[UIApplication sharedApplication] endIgnoringInteractionEvents] khi bạn cần nhận lại lần chạm.

3

Bạn cần phải gọi [super touchesMoved:withEvent:] để cho quan điểm siêu sạch từ sự kiện nhưng quan trọng hơn, bạn cần phải không gọi [super touchesCancelled:withEvent:].

Dưới đây là những gì tôi được sử dụng trên một tế bào để giữ cho nó khỏi bị được lựa chọn khi tôi phát hiện một swipe:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!showingEdit) { 
     if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) { 
      RESPOND_TO_SWIPE 
      showingEdit = YES; 
      [super touchesCancelled:touches withEvent:event]; 
     } else { 
      [super touchesMoved:touches withEvent:event]; 
     } 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!showingEdit) { 
     [super touchesEnded:touches withEvent:event]; 
    } 
} 
+1

Điều này không hiệu quả đối với tôi. – ma11hew28

2

Tôi không nghĩ rằng nó có thể bởi vì tôi không nhìn thấy nó ghi nhận và không ai trong số các giải pháp này công việc.

-2

Bạn có thể kiểm tra xem, các vị trí điểm tiếp xúc có nằm trong CGRect (ví dụ: các điểm có trong Hình chữ nhật của số lần xem của bạn) hay không. Nếu họ không ở trong Rect đó, chạm sẽ bị hủy.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
CGPoint touchLocation = [touch locationInView:self.view]; 

    if (CGRectContainsPoint(myImageView, touchLocation)) 
    { 
     lastPoint = [touch locationInView: myImageView]; 
    } 

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y); 
    } 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint currentPoint; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInView:self.view]; 

    if (CGRectContainsPoint(myImageView.frame, touchLocation)) 
    { 
     currentPoint = [touch locationInView: myImageView]; 
    } 
} 
+1

Mã đó không hủy thêm các cuộc gọi đến 'touchesMoved:'. Nó chỉ bỏ qua chúng. – ma11hew28

0

On iOS5 có vẻ là một phương pháp tư nhân trong UITouch

-(void)setSentTouchesEnded:(BOOL)ended; 

Tùy tình hình thực hiện táo của nó có thể ngừng gửi các sự kiện

Một cách khác để làm như vậy sẽ được sử dụng kết hợp các đối tượng

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue]) 
     return; 
    if (sometouchisoutsideofview) { 
     objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN); 
    } 
} 
3

Thử cài đặt tạm thời UserInteraction của UIImageView Kích hoạt tài sản để NO

0

Tôi chỉ cố gắng giải quyết một cái gì đó như thế này, và thấy rằng không có giải pháp nào liệt kê cô ấy đã làm việc cho tôi. Điều tốt nhất tôi có thể xoay xở là tạm thời phớt lờ những cái chạm, nhưng sau đó họ lại tiếp tục khi chạm lại vào màn hình.

Cuối cùng đã giải quyết được.

  1. Thiết lập một lá cờ boolean gọi là "khuyết tật"
  2. Trong touchedMoved, kiểm tra đầu tiên mà các liên lạc ở bên trong giao diện bạn muốn. Nếu không, hãy đặt cờ bị vô hiệu thành YES.
  3. Vẫn đang được chạm vàoĐược yêu thích, hãy kiểm tra cờ trước khi thực hiện hành động của bạn. Vì vậy, tại thời điểm này, sẽ không có gì xảy ra nếu chúng ở bên ngoài chế độ xem.
  4. Khi chạm, hãy đặt cờ bị vô hiệu thành KHÔNG. Vì vậy, chuỗi liên lạc bị tạm dừng hiệu quả cho đến khi người dùng nhấc ngón tay lên.

Tôi đoán điều này sẽ phù hợp với bạn trừ khi bạn có lý do cụ thể cần phải hủy chuỗi liên lạc.

+0

Bạn thậm chí có thể thực hiện theo dõi kiểu UIControl bằng cách sử dụng một cờ đơn. Mà cảm thấy tự nhiên hơn nếu toàn bộ chuỗi sự kiện đã bị hủy cùng một lúc. – Andy

1

Giải pháp "Lực lượng vũ phu" tùy thuộc vào việc phù hợp với nhu cầu của bạn: Xóa và khởi tạo lại chế độ xem phụ sẽ nhận được chạm hoặc phản hồi (tất nhiên là xử lý khung và nội dung).

-1

Bạn có thể tạo danh mục cho UITouch. Bạn có thể khai báo

@property (nonatomic,strong,readwrite) UIView *view; 

Và khi bạn thay đổi touch.view để nil, ví dụ, bạn có thể mô phỏng cuối dispatching các sự kiện liên lạc

1

Mã này sẽ giúp bạn. Tôi vô hiệu hóa sự kiện liên lạc trong touchesMoved: phương pháp và tôi đang tạo điều kiện cho sự kiện liên lạc trong touchesCancelled: phương pháp

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    ....... 
    ....... 
    Your code 
    ....... 
    ....... 

    //Condition when you want to disable touch event 

    [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

    ....... 
    ....... 
    Your code 
    ....... 
    ....... 
} 


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
} 
+0

Điều này không hiệu quả đối với tôi. – avance

1

tôi đạt được điều này bằng cách loại bỏ các quan điểm từ SuperView của nó và thêm nó thẳng trở lại.

[view retain]; 
UIView *sv = view.superview; 
[view removeFromSuperview]; 
[sv addSubview:view]; 
[view release]; 

Điều này sẽ phá vỡ chuỗi phản hồi thành chế độ xem sao cho mọi chạm còn lại sẽ không được nhận trên chế độ xem. Liên lạc tiếp theo vẫn sẽ được nhận như bình thường.

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