2011-10-16 21 views
6

Tôi đã nâng cấp iPad lên 5.0 một vài ngày trước và nâng cấp Xcode lên 4.2 cùng một lúc để tôi có thể tiếp tục thử nghiệm các ứng dụng của mình. Bây giờ tôi đang gặp sự cố với mã cảm ứng trong một số ứng dụng hoạt động với các phiên bản trước của Xcode.Hành vi xử lý cảm ứng UIView đã thay đổi với Xcode 4.2?

Tôi đã thêm UIImageView lớp con để thêm một số tính năng kéo bằng cách ghi đè -(void)TouchesBegan-(void)TouchesMoved. Tôi đã làm không ghi đè -(void)TouchesEnded trong lớp con, nhưng đã xử lý điều đó trong trình điều khiển chế độ xem cho chế độ xem có chứa chế độ xem hình ảnh.

tôi kéo subclassed UIImageView vào một dự án mới để thử nghiệm, và đã thu hẹp xuống vấn đề thực tế là phụ huynh UIView (template được tạo ra bởi Xcode) dường như không thể chuyển tiếp các sự kiện liên lạc với bộ điều khiển xem (cũng được tạo bởi Xcode).

Nếu tôi thêm này để lớp con của tôi:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 

và đây để xem cha mẹ của tôi điều khiển xem:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ViewController"); 
} 

khi tôi buông bỏ hình ảnh Tôi kéo xung quanh màn hình, tôi nhận được "touches ended event in ImageToDrag", nhưng không phải là nhật ký từ bộ điều khiển chế độ xem.

Tuy nhiên, nếu tôi cố tình bỏ qua quan điểm bằng cách làm này trong giao diện subclassed:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended event in ImageToDrag"); 
    [[self.nextResponder nextResponder] touchesEnded:touches withEvent:event]; 
} 

sau đó tôi nhận được cả hai mục log.

Giải thích duy nhất tôi có thể đưa ra là vì một lý do nào đó, UIView đang tiêu thụ sự kiện touchesEnded và không chuyển nó tới bộ điều khiển chế độ xem.

Tôi đã xác minh rằng exclusiveTouch được thiết lập để NO, và userInteractionEnabled được thiết lập để YES trên quan điểm phụ huynh và các subclassed UIImageView.

Tôi cũng đã thử nghiệm biên dịch cho iOS 5.0 và iOS 4.2 và triển khai ứng dụng thử nghiệm cho cả iPad 5 iPad và iOS 4.3.1.

Cách duy nhất tôi có thể nhận sự kiện chạm vào viewController là bỏ qua chế độ xem và sử dụng số nextResponder trong lớp con. Mặc dù phương thức đó có chức năng, nhưng nó có vẻ như là một hack với tôi và tôi chắc chắn nó sẽ trở lại để cắn tôi sau này.

Có ai khác đã xem hành vi này không? Có cách nào để tôi tìm hiểu những gì UIView đang thực hiện với các sự kiện liên lạc của tôi không?

Xin cảm ơn, Dan

Trả lời

5

Tôi đã cố gắng theo dõi vấn đề tương tự trong vài giờ qua. Cuối cùng quản lý để giải quyết nó với sự giúp đỡ của this post

Trên thực tế nó trông giống như tôi chỉ quản lý để giải quyết nó, sử dụng gợi ý từ https://devforums.apple.com/message/519690#519690
Trước đó, tôi chỉ chuyển tiếp sự kiện touchesEnded để self.nextResponder. Khi tôi thêm chạm vàoBegan, Đã di chuyển, Trình xử lý bị hủy với các cài đặt tương tự làm điểm chạmĐược rồi, sự kiện dường như bong bóng lên đến chế độ xem gốc .
Vì vậy, tôi đoán trên iOS5, lượt xem loại bỏ chạm Chạm vào các sự kiện được hiển thị khi họ chưa thấy các liên lạc có liên quanBấm.

Tôi không cần phải thêm Đã di chuyển/v.v., tôi vừa chuyển tiếp trên TouchesBegan, sau đó chạm vàoĐã bắt đầu hoạt động trở lại!

+0

Điều này đã làm các trick. Điều quan trọng là tôi đã phải chuyển tiếp các sự kiện của mình cho người giám sát sau khi xử lý chúng. Một lưu ý khác là tôi đã phải sử dụng "siêu" thay vì "self.nextResponder" để làm cho nó hoạt động. – dlenhard

+0

Cảm ơn bạn đã trả lời câu hỏi này. Đã xé tóc của tôi trên này. –

2

Một số xử lý cảm ứng đã có cơ hội trong iOS 5.0; đặc biệt là nếu bạn liên kết lại ứng dụng của mình với SDK 5.0.

Có phương pháp xử lý cảm ứng một phần UIView rằng nói điều này:

Nếu bạn ghi đè phương pháp này mà không gọi siêu (việc sử dụng mô hình phổ biến), bạn cũng phải ghi đè lên các phương pháp khác để xử lý các sự kiện liên lạc, nếu chỉ như triển khai sơ khai (empy).

Vì vậy, nếu bạn làm như vậy, bạn cần phải làm tất cả. Tôi biết UIKit bắt đầu thực hiện các bước để đảm bảo đây là trường hợp trong 5.0.

Vì vậy, tôi sẽ bắt đầu ở đó - ghi đè tất cả các phương pháp trên chế độ xem của bạn và xem điều gì sẽ xảy ra.

+0

Tôi đang ghi đè trọng lượngBằng và chạm vàoĐược yêu thích trong phân lớp ... nhưng không chạm vàoĐược khắc phục. Tôi sẽ cố gắng xem nó có xóa nó không. – dlenhard

+0

Tôi đã cố gắng ghi đè trọng hơnĐược khắc phục trong chế độ xem, và nó vẫn không hoạt động mà không sử dụng doubleResponder đôi. – dlenhard

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