2012-08-25 28 views
10

Tôi đang gặp sự cố với việc xử lý nhiều lần chạm thông qua các phương thức chạm/Chuyển/Kết thúc của UIViewController. Tôi cũng nhìn thấy hành vi tương tự trong một ứng dụng cocos2d (sử dụng ccTouchesBegan/Moved/Ended) vì vậy tôi nghĩ rằng câu hỏi này có thể được áp dụng cho tất cả xử lý cảm ứng trong iOS. Tôi đã đặt mã mà tôi đang sử dụng bên dưới, theo sau là kết quả mà tôi thấy.Tại sao chạm vào UIViewControllerBegan, chạm vàoCảm ứng & chạm Chạm vào chỉ được gọi khi lần đầu tiên của hai lần chạm bắt đầu, di chuyển hoặc kết thúc?

Tất cả các phương pháp được triển khai trên lớp con UIViewController.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"Touches Began"); 
    [self logTouchesFor: event]; 

    [super touchesEnded: touches withEvent: event]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"Touches Moved"); 
    [self logTouchesFor: event]; 

    [super touchesEnded: touches withEvent: event]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"Touches Ended"); 
    [self logTouchesFor: event]; 

    [super touchesEnded: touches withEvent: event]; 
} 

-(void)logTouchesFor:(UIEvent *)event 
{ 
    int count = 1; 

    for (UITouch *touch in event.allTouches) 
    { 
     CGPoint location = [touch locationInView: self.view]; 

     NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y); 
     count++; 
    } 
} 

Bây giờ cho các kết quả thú vị ...

Chạm Độc việc như mong đợi

Hãy nói rằng tôi chạm vào màn hình bằng ngón tay cái của tôi. Tôi thấy trong cửa sổ đầu ra mà touchesBegan đã được gọi là như mong đợi. Tôi di chuyển ngón tay cái của tôi xung quanh và chạm vàoMoved được gọi. Sau đó, tôi nhấc ngón tay cái ra khỏi màn hình và chạm vàoEnded được gọi. Tất cả điều này là như mong đợi, tôi bao gồm nó trong câu hỏi như một trường hợp kiểm soát - chỉ cần được rõ ràng rằng bộ điều khiển xem của tôi là nhận được các sự kiện liên lạc và tôi đã không bỏ lỡ một vc.view.userInteractionEnabled = YES bất cứ nơi nào.

thứ hai cảm ứng không gây touchesBegan, touchesMoved hoặc touchesEnded được gọi

Đây là một trong những thú vị nhất. Hãy nói rằng tôi chạm vào màn hình với ngón tay cái của tôi (touchesBegan được gọi) và giữ nó vẫn còn trên màn hình. Sau đó, tôi chạm vào một nơi khác trên màn hình bằng ngón tay trỏ của mình, trong khi vẫn giữ ngón cái của tôi ở cùng một vị trí. TouchesBegan không được gọi. Sau đó, chúng ta hãy nói rằng tôi di chuyển ngón tay trỏ của tôi trong khi giữ ngón tay cái của tôi hoàn toàn vẫn còn (điều này có thể được khôn lanh nhưng nó có thể). TouchesMoved không được gọi. Sau đó, tôi nhấc ngón trỏ ra khỏi màn hình. TouchesEnded không được gọi. Cuối cùng, tôi di chuyển ngón tay cái của tôi và chạm vàoMoved được gọi. Sau đó, tôi nhấc ngón tay cái của tôi từ màn hình và chạm vàoEnded được gọi.

Chỉ cần rõ ràng: Tôi đã đặt self.view.multipleTouchEnabled = YES trong phương thức viewDidLoad của tôi.

Thông tin về Touch Thứ hai là có sẵn, Cung cấp Touch đầu tiên Di chuyển

Lần này tôi làm điều gì đó rất giống với ví dụ ngay ở trên. Tôi chạm vào màn hình bằng ngón cái, rồi ngón tay trỏ trong khi vẫn giữ ngón tay cái của tôi. TouchesBegan được gọi khi ngón tay cái của tôi chạm vào màn hình, nhưng không phải ngón tay trỏ của tôi. Bây giờ tôi di chuyển ngón tay cái của tôi, và chạm vàoMoved được gọi. Không chỉ vậy, nhưng có hai chạm trong mảng event.allTouches (và có, liên lạc thứ hai là nơi tôi mong đợi nó được). Điều này có nghĩa là hệ thống nhận thức được rằng tôi đã chạm vào màn hình lần thứ hai, nhưng tôi không được thông báo thông qua các phương thức xử lý cảm ứng trên bộ điều khiển xem của tôi.

Làm cách nào để được thông báo về các thay đổi đối với lần chạm thứ hai?

Tôi thực sự muốn có thể phản hồi những thay đổi về vị trí hoặc trạng thái của lần chạm thứ hai khi chúng xảy ra, thay vì khi lần chạm đầu tiên cũng thay đổi. Rất nhiều thời gian này sẽ không phải là một vấn đề bởi vì nó rất khó để thay đổi một liên lạc mà không ảnh hưởng đến khác, nhưng tôi có ít nhất một tình huống mà nó có thể là một vấn đề. Tôi có thiếu một cái gì đó hiển nhiên? Có ai khác nhận thấy hành vi này hoặc có vấn đề với nó?

Trong trường hợp có liên quan, tôi đang sử dụng iPhone 3GS chạy iOS 5.1.

+0

bạn có 'exclusiveTouch = YES'tại đây trong hệ thống phân cấp chế độ xem của bạn không? Điều này dường như xảy ra với tôi khi chạm lần đầu tiên trong một chế độ xem của chế độ xem với 'exclusiveTouch = YES' –

+0

Tôi không đặt nó ở bất kỳ đâu trong mã, nhưng tôi đang sử dụng bảng phân cảnh - có thể họ đã đặt nó ở đâu đó không? Có bất kỳ tài sản nào khác có thể có tác dụng tương tự không? Bộ điều khiển xem này là một vài thế hệ sâu trong hệ thống phân cấp khung nhìn nên một trong những người giám sát của nó có thể đang làm điều gì đó mà tôi không mong đợi. – rankAmateur

+1

có thể là tôi đã quá muộn nhưng bạn có nhận thấy rằng trong mọi phương pháp, siêu được gọi là giống nhau: touchesEnded – advantej

Trả lời

11

Ok, tôi bắt đầu cẩn thận xây dựng lại dự án của tôi, thêm vào các tập tin cùng một lúc, và tôi nghĩ rằng tôi đã nhận nó ...

Có một subview về quan điểm trong câu hỏi mà có userInteractionEnabled == YES. Khi tôi đặt thiết bị này thành NO, bộ điều khiển chế độ xem của tôi đã bắt đầu nhận được chạm vào Cuộc gọi/Đã di chuyển/Kết thúc cho mỗi lần chạm. Có lẽ, liên lạc thứ hai đã được tuyên bố bởi subview và không làm cho nó để điều khiển xem của tôi, nhưng tôi không có ý tưởng tại sao điều này sẽ chỉ xảy ra với các liên lạc thứ hai và không phải là đầu tiên.

Tôi chưa tìm ra điều gì đang xảy ra với dự án cocos2d, nhưng có lẽ đó là một vấn đề khác vì không có bản xem trước hoặc nút nào có thể làm tương tự.

+3

Có thể là chế độ xem phụ của bạn đã có nhiềuTouchEnabled == KHÔNG? –

+0

Vâng, nó đã làm, nhưng tôi vẫn không hiểu lý do tại sao nó đã liên lạc thứ hai hơn là lần đầu tiên. – rankAmateur

+5

Bạn đang gọi phương thức touchesEnd super trong phương thức của riêng bạn. Bạn nên gọi super touchesBegan. (và ngược lại cho touchesMoved) – Toad

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