2012-06-04 19 views
19

Tôi nghĩ khi xem được chạm hoặc chạm vào, xử lý của nó được gọi là đầu tiên, và sau đó xử lý của superview được gọi là (tuyên truyền trở lên).Trên iOS, nếu userInteractionEnabled của người giám sát là KHÔNG, thì tất cả các bản xem phụ đều bị vô hiệu hóa?

Nhưng có đúng là nếu số userInteractionEnabled của người giám sát được đặt thành KHÔNG, thì tất cả các cuộc phỏng vấn và con cái cũng bị tắt cho tương tác của người dùng? Điều gì sẽ xảy ra nếu chúng tôi muốn vô hiệu hóa chế độ xem chính nhưng không muốn vô hiệu hóa cho các bản xem trước?

+0

Đúng vậy. – Lefteris

+0

aha, tôi đã tự hỏi quy tắc hoặc cơ chế nào của UIResponder gây ra điều này ... mặc dù ngay bây giờ tôi đã ghi nhớ điều này là "thực tế" –

Trả lời

13

Bạn không thể làm điều đó,

Thay vào đó bạn sẽ thay đổi sự sắp xếp của quan điểm của bạn như sau:

Main View-> subViews 

Để

Container View -> Main View that you want to set as inactive 
       -> other views that you want to still active 

subviews Vì vậy, giao diện chính hiện tại của bạn và bạn hiện tại sẽ trở thành anh chị em, trẻ em của chế độ xem vùng chứa mới

+0

"không thể làm điều đó" "đó là gì"? Bạn đang đề cập đến phần nào của câu hỏi? – Honey

18

Nếu điều này m ay là hữu ích, tôi tìm thấy điều này trong lập trình iOS 5 bởi Matt Neuburg, p. 467:

userInteractionEnabled

Nếu thiết lập để NO, quan điểm này (cùng với subviews của nó) được loại trừ khỏi chạm nhận. Chạm vào chế độ xem này hoặc một trong các chế độ xem phụ của nó "fall thông qua" để xem sau nó.

Hơn nữa, tổ chức sự kiện của Apple Xử lý Hướng dẫn dành cho iOS nói:

Đối tượng cửa sổ sử dụng lần truy cập thử nghiệm và chuỗi responder để tìm xem nhận sự kiện liên lạc. Trong thử nghiệm lượt truy cập, 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 chế độ xem trong hệ thống phân cấp chế độ xem trả về CÓ, tiến hành phân cấp cho đến khi tìm thấy chế độ xem phụ trong phạm vi liên lạc của số . Chế độ xem đó trở thành chế độ xem thử nghiệm lần truy cập.

và Lập trình iOS 5 bởi Matt Neuburg, p.485 nói rằng nếu một cái nhìn được đánh dấu userInteractionEnabled như NO, hoặc hidden như YES, hoặc opacity gần 0 thì xem và subview nó sẽ không được đi qua bởi HitTest (và do đó không được xem xét cho bất kỳ liên lạc nào).

+1

Thông tin tuyệt vời cho những người thực hiện 'hitTest: withEvent:' của riêng họ. Tôi không chắc liệu tôi có cần kiểm tra 'if (subview.userInteractionEnabled)' ở cấp độ giám sát hay không, nhưng nó xuất hiện việc thực thi mặc định sẽ kiểm tra thuộc tính 'userInteractionEnabled' của nó. ' – darvids0n

+0

những gì hiện "rơi qua" để một cái nhìn đằng sau nó. "Có nghĩa là? Điều đó có nghĩa là khai thác trên các nút được subviews sẽ không hoạt động? – Honey

1

Phương pháp đầu tiên

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE; 
    return TRUE; 
} 

Phương pháp thứ hai

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)]; 
    r.cancelsTouchesInView = NO; 
    [agentPicker addGestureRecognizer:r]; 
14

Bạn có thể ghi đè lên hitTest(_:withEvent:) phớt lờ quan điểm riêng của mình, nhưng vẫn cung cấp chạm đến subviews của nó.

class ContainerStackView : UIStackView { 
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     let result = super.hitTest(point, withEvent: event) 
     if result == self { return nil } 
     return result 
    } 
}