quote này sẽ trả lời câu hỏi của bạn như tại sao nó cư xử như thế:
Sự kiện chạm. Đối tượng cửa sổ sử dụng thử nghiệm hit và chuỗi trả lời để tìm xem để nhận sự kiện chạm. Trong thử nghiệm lượt truy cập, một cửa sổ gọi hitTest: withEvent: ở chế độ xem trên cùng của hệ thống phân cấp chế độ xem; phương thức này được tiến hành bằng cách gọi đệ quy pointInside: withEvent: trên mỗi khung nhìn trong hệ thống phân cấp khung nhìn trả về YES, tiến hành phân cấp cho đến khi nó tìm thấy subview nằm trong giới hạn của nó. Chế độ xem đó trở thành chế độ xem thử nghiệm lần truy cập. (source)
Một workaround là để tạo của riêng bạn UITapInSubviewsView
với định nghĩa sau đây cho hitTest
:
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
UIView *iSubView;
while ((iSubView = [reverseE nextObject])) {
UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
if(viewWasHit)
return viewWasHit;
}
return [super hitTest:point withEvent:event];
}
Sau đó, bạn sử dụng lớp này để xem cha mẹ của bạn.
(Tôi tìm thấy mã này trong một bài đăng từ S.O. một vài tuần trước, nhưng tôi dường như không thể tìm thấy nó nữa; vì vậy chỉ cần sao chép từ dự án của tôi).
Bạn có thể mở rộng câu trả lời một chút về nguyên nhân của việc này không - có phải vì hittest mặc định bỏ qua các lần chạm bên ngoài giới hạn chế độ xem gốc không? Và tôi cần phải kiểm tra bản thân mình cho dù chạm là trong giới hạn trẻ em? – Jaanus