iOS开发触摸事件的传递
1. iOS中的三種事件類型 觸摸事件、加速計事件、遠程事件。
觸摸事件:通過觸摸、手勢進行觸發(例如手指點擊、縮放)
加速計事件:通過加速器進行觸發(例如手機晃動,典型應用是微信搖一搖)
遠程事件:通過其他遠程設備觸發(例如耳機控制按鈕)
觸摸事件的實現方法有四種,touchBegin/touchesMoved/touchesEnded/touchesCancelled
2. 觸摸事件的傳遞
要想響應觸摸事件必須得有一個前提,就是該對象必須是響應者對象,繼承了UIResponder的對象就是響應者對象,只有響應者對象才能夠接收并處理事件
(1)事件是怎么的產生和傳遞"
①.當手指觸摸屏幕后會產生 '觸摸事件', 然后將事件加入UIApplication的管理事件隊列中
②.UIApplication會取出事件隊列中 '最前面的事件' 分發下去,事先分發給應用程序的主窗口中 'keyWindow'
③.主窗口接收到事件后,分發給自己的子控件,尋找最適合的接收事件的控件
④.找到 '最適合' 接收的控件后,調用控件的touchesBegin/touchesMoved/touchesEnded方法
"2、如何找到最合適的控件來處理事件?"
①.判斷自己是否能接收觸摸事件?
? /*
?? 控件不接收觸摸事件的三種情況
?? 1> 不接收用戶交互 userInteractionEnabled=NO
?? 2> 隱藏 hidden = YES
?? 3> 透明 alpha = 0.0 ~ 0.01
?? */
②.判斷觸摸點是否在自己身上?
?? /*
? ? * 判斷觸摸點在不在自己身上,view有一個方法【-(BOOL)pointInside:withEvent:】
? ? * 返回NO,就代表不在自己身邊上,那不再遍歷子控件
? ? * 返回YES,代表點在自己向上,那繼續遍歷子控件
? ? */
③.從后往前遍歷子控件,重復前面的兩個步驟
④.如果沒有符合條件的子控件,那么就自己最適合處理的控件
⑤.找到最適合的控件后就調用touchesBegin/touchesMoved/touchesEnded方法
?(2)響應者鏈條
"什么是響應者鏈條"
①.由多個響應者對象連接起來的鏈條叫做響應者鏈條
②.什么是上一個響應者?
?? >如果當前這個view是控制器的view,控制器就是上一個響應者
?? >如果當前這個view不是控制器的view,那么父控件就是上一個響應者
?
③.利用響應者鏈條可以讓多個控件處理同一個 "觸摸事件"
?? "怎么讓多個控件處理同一個 ‘觸摸事件’ 事件?"
?? >在最后適合的控件里調用super的touchesBegan方法,這樣就將事件傳給上一個響應,上一個響應者也可以處理事件了
?
?
"3、小結:事件的完整處理過程"
①.先將事件對象由上往下傳遞(由父控制傳給子控件),找到最適合的控件來處理
②.調用最合適的控件的touches...方法
③.如果調用了[super touch…],就會將事件順著響應都鏈往上傳遞,傳遞給上一個響應者
④.接著上一個響應者就會調用的touches...方法
⑤.如果沒有找到最適合的控件來處理事件,則將事件傳回來窗口,窗口不處理事件,將事件傳給UIApplication
⑥.如果Applicatoin不能處理事件,則將其丟棄
?
轉載于:https://www.cnblogs.com/xiaofei993/p/5344995.html
總結
以上是生活随笔為你收集整理的iOS开发触摸事件的传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二次冲刺阶段 站立会议09
- 下一篇: JSP知识点大致介绍1