2012-05-07 23 views
5

Thiết lập: Tôi có chế độ xem cha mẹ A. Có chế độ xem con B. B là một phần nằm trong giới hạn của A, nhưng một phần bên ngoài (A có clipToBounds = false). Tôi đã đính kèm UITAPGestureRecognizer (UITGR) vào B.Cách kích hoạt tính năng UITapGestureRecognizer trên chế độ xem con bị cắt bớt một phần bởi chế độ xem gốc?

Quan sát: UITGR kích hoạt OK khi tôi chạm vào phần B nằm trong giới hạn của A. UITGR KHÔNG phát ra khi tôi chạm vào phần B bên ngoài các giới hạn của A.

Mong đợi/câu hỏi: Làm thế nào để tạo lửa UITGR khi tôi chạm vào phần B nằm ngoài giới hạn của A?

Trả lời

6

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).

0

Bạn phải viết hàm hitTest của riêng bạn cho xem A.

Ngoài ra nhìn vào câu hỏi này: UITapGestureRecognizer not triggered in deep view hiearchy

+0

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