事件的传递与响应
?
事件的傳遞是從上到下(父控件到子控件),事件的響應是從下到上(順著響應者鏈條向上傳遞):子控件到父控件。
如何判斷上一個響應者?
-
如果當前這個view是控制器的view,那么控制器就是上一個響應者
-
如果當前這個view不是控制器的view,那么父控件就是上一個響應者
響應者鏈條的事件傳遞過程?
-
如果view 的控制器存在,就傳遞給控制器;
-
如果控制器不存在,則將其傳遞給它的父視圖
-
在視圖層次結構的最頂級視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給 window 對象進行處理
-
如果 window 對象也不處理,則其將事件或消息傳遞給 UIApplication 對象
-
如果 UIApplication 也不能處理該事件或消息,則將其丟棄(銷毀)
如何做到一個事件多個對象處理?
因為系統(tǒng)默認做法是把事件上拋給父控件,所以可以通過重寫自己的touches方法和父控件的touches方法來達到一個事件多個對象處理的目的。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 1.自己先處理事件...NSLog(@"do somthing...");// 2.再調用系統(tǒng)的默認做法,再把事件交給上一個響應者處理[super touchesBegan:touches withEvent:event]; }?
總結
-
如果父控件不能接收觸摸事件,則子控件也無法接收觸摸事件
-
如果想讓控件不處理觸摸事件,可以設置userInteractionEnabled = NO,結果是包括父控件在內的所有子控件都不能處理觸摸事件(雖然設置透明度和hidden=YES也可以,但是那樣就看不見了注意:如果父控件的透明度設置為0或者hidden=YES,那么子控件也是不可見的。)
-
遍歷一個控件的子控件的順序是從上到下的(最后添加的view最先被遍歷)。
-
指定某一個子控件響應事件,只需要在父控件的hitTest中返回指定的子控件就可以。
-
如果一個控件的isUserInteractionEnabled=false,想讓它繼續(xù)繼續(xù)處理觸摸事件,可以在它的父控件的hitTest方法中直接返回它。
-
hitTest查找第一響應者的時候,即便父控件是第一響應者,還是要調用子控件的hitTest方法,否則怎么知道是不是還有其他最合適的響應者
-
先調用父控件的point:inside:方法
-
調用最上面子控件的point:inside:方法
-
如果最上面子控件的point:inside:方法返回false,則對應的hitTest返回nil
-
轉載于:https://www.cnblogs.com/mustard22/p/11093084.html
總結
- 上一篇: Mysql 8.0安装
- 下一篇: 小程序协同工作和发布