2010-09-06 23 views
5

Tôi có một UIView có một loạt các cuộc phỏng vấn. Các cuộc phỏng vấn sẽ có thể nhận được các sự kiện cảm ứng, nhưng vì một lý do nào đó, UIView của phụ huynh mất liên lạc và không vượt qua nó. Tôi đã tạo ra nó trong một cách rất chuẩn như tôi luôn luôn tạo ra quan điểm:iphone/ipad - cha mẹ UIView đang chặn chạm từ việc đến các bản xem trước - tại sao?

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)]; 
    self.mainView = myView; 
    [myView release]; 

    [self.view addSubview:self.mainView]; 

Sau đó, tôi tạo subviews và thêm chúng như bình thường:

[self.mainView addSubview:someOtherView]; 

Tôi biết self.mainView là nhận được những sự kiện liên lạc khi Tôi lắng nghe trong giao diện người dùng chính của chính:

VIEW: <UIView: 0x8d34aa0; frame = (0 0; 1024 768); 

Nhưng tại sao trên thế giới tôi không thể nhận được các bản phụ để nhận được chạm? Tôi không hiểu tại sao điều này xảy ra đôi khi. Tôi không thay đổi bất kỳ thuộc tính mặc định nào của mainView.

Trả lời

15

Đã phải làm với khung của chế độ xem gốc. Nếu khung không bao gồm các bản xem trước, chúng sẽ không nhận được chạm.

+1

cũng lưu ý tham khảo các giới hạn của chế độ xem cha mẹ khi định vị các bản xem phụ của bạn trên màn hình. Khung của bạn có thể hoặc không thể là vị trí thực tế trên màn hình. – MOK9

+0

@ sol: Làm thế nào để bạn biết nếu đó là trường hợp? – moonman239

0

Bạn có chạm vào trình xử lý gọi các trình xử lý superclass không?

ví dụ: trong touches của bạnBegan, gọi:

[super touchesBegan:touches withEvent:event]; 
+0

Tôi không có bất kỳ trình xử lý cảm ứng nào. Các cuộc phỏng vấn chỉ là không đáp ứng với chạm. Ví dụ: GestureRecognizer trên một trong các bản xem phụ không hoạt động. – sol

12

Các điểm chạm của UIView không được chuyển tới các bản xem trước nếu chúng nằm ngoài giới hạn của người giám sát như được đề cập trong giải pháp.

Tuy nhiên, nếu bạn muốn các bài đánh giá này phản hồi lại liên lạc, hãy ghi đè hitTest:withEvent: của người giám sát.

Documentation on Event Delivery

cảm ứng sự kiện. Đố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.

  1. Tạo phân lớp của UIView (hoặc lớp con UIView khác).
  2. Ghi đè hitTest: withEvent.
  3. Sử dụng lớp con UIView này làm người giám sát, vì vậy, chế độ xem phụ có thể phản hồi các lần chạm.

Add phương pháp dưới đây trong lớp con:

(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]; 
} 

Lưu ý: Enumerator Xếp sử dụng từ subviews được sắp xếp từ sau ra trước và chúng tôi muốn thử nghiệm xem trước nhất đầu tiên.

+0

Điều này làm việc cho tôi. Cảm ơn bạn đã đăng bài này! – tjg184

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