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
và -(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
Đ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
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. –