4.如果沒有符合條件的子控件,那么就自己最適合處理
這里的“問”默認是通過控件的- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event方法一層一層從外往內掉用;
找到最后找到最適合處理該觸摸事件的控件,該控件默認會有對觸摸事件的處理:(以下就該是響應者鏈條的內容了)
根據控件對事件的默認響應情況,大概分三種(肯定不止):
1.button:默認會處理響應該事件,并且不會再調用 [super touchesBegan:touches withEvent:event];向上拋響應,這樣該響應鏈條就斷了;
2.uiview: 如果不實現uitouches方法,默認會調用父類(uiresponser)中的touches方法,該方法內部默認會自動把響應交給下一響應者處理;
3.uiimageview:默認是不與用戶交互的,所以該控件默認也就不會被選為最佳處理事件的控件,所以該種類不應該算;
如果控件自己實現了touches方法來處理觸摸事件,并且響應完又調用了[super touchesBegan:touches withEvent:event];來讓下一響應者繼續響應,這樣一層一層由里向外久構成了響應者鏈條;
需要說明的是:響應者不都必然是view等控件,也可能是viewController等控制器(UIviewController也繼承于UIresponser);
找下一響應者的原則是:
1>如果當前這個view事控制器的view,那么控制器就是上一個響應者(控制器也繼承了UIResponser,所有控制器也有touches&hell
ip;…方法)
2>如果當前這個view不是控制器的view,那么父控件就是上一個響應者
1.如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖
2.在視圖層次結構的最頂級視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對象進行處理
3.如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象
4.如果UIApplication也不能處理該事件或消息,則將其丟棄