自學iOS有一兩個月了,一直沒有好好整理學習筆記,打算今天開始慢慢補上,就當是復習和補缺補漏吧。
iOS的事件大致分為三種:觸摸事件、加速計事件、遠程控制事件
首先要理解以下幾個概念:
一、響應者對象:
在iOS中不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接收并處理事件。我們稱之為“響應者對象”。
UIapplication、UIViewController、UIView都繼承自UIResponder,因此它們都是響應者對象,都能夠接收并處理事件。
二、UIResponder處理事件的主要方法
觸摸事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
加速計事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
遠程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;
三、UITouch
用戶同時觸摸的手指,每一根就代表一個UITouch對象,它保存著跟手指相關的信息,比如觸摸的位置、時間、階段。
當手指移動(move)時,系統會更新同一個UITouch對象,使之能夠一直保存該手指在的觸摸位置。
當手指離開(end)屏幕時,系統會銷毀相應的UITouch對象.
四、UIEvent
觸摸事件發生,必須會產生一個UIEvent對象,稱為事件對象,記錄事件產生的時刻和類型。
五、首先處理事件的響應者
發生觸摸事件后,系統會將該事件加入到一個由UIApplication管理的事件隊列中。
UIApplication會從事件隊列中取出最前面的事件,并將事件分發下去以便處理,通常,先發送事件給應用程序的主窗口(keyWindow)
主窗口會在視圖層次結構中找到一個最合適的視圖來處理觸摸事件,這也是整個事件處理過程的第一步
找到合適的視圖控件后,就會調用視圖控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
下面是老師上課的PPT示例,說的很明白。
UIView不接收觸摸事件的三種情況
1.alpha= 0.0 ~ 0.01
2.hidden屬性=YES
3.userInteractionEnabled=YES
注意:UIImageView的userInteractionEnabled默認就是NO,因此UIImageView以及它的子控件默認是不能接收觸摸事件的
六、響應者鏈條
合適的控件調用touches方法后,會默認地將事件順著響應者鏈條向上傳遞,將事件交給上一個響應者進行處理。
尋找上一個響應者的過程,看起來是尋找首要合適控件的逆過程。
當前響應者的touches方法中如果調用[super touches],就會對用上一個響應者touches方法,同時可以將UITouch對象和UIEvent對象向上傳遞。
這樣就能夠將一次觸摸事件的事件對象和觸摸對象的信息傳遞給多個響應者。
問題:上一個響應者(nextResponder)是誰?
判斷步驟:
1>如果當前的view是控制器的view,控制器就是上一個響應者
2>如果當前的view不是控制器的view,那么父控件就是上一個響應者
3>如果當前響應者是控制器,那么上一個響應者是UIWindow;如果UIWindow也不處理,就再往上傳給UIApplication
4>如果UIApplication也不處理,那么這條消息就被會廢棄
七、觸摸事件處理過程
1.用戶觸摸后,系統先將事件對象(event)由上往下傳遞(父控件傳給子控件),找到最合適的控件來處理事件(遞歸查找當前控件的最適合子控件)
2.調用合適控件的touches相關方法
3.如果調用了super的touches相關方法,就會將事件順著響應者鏈條往上傳遞,傳給上一個響應者
4.接著就會調用上一個響應者的touches方法
5.只要當前響應者的touches方法中調用了super的touches方法,還會繼續往上遞歸調用,直到不再調用super的touches方法
八、補充面試題:什么是響應者鏈條?
以下幾個點是李明杰老師給的參考回答,可學習借鑒:
1>響應者鏈條是由多個響應者對象連接起來的鏈條
2>響應者對象是指能夠處理事件的對象,即繼承UIResponder的對象
3>利用響應者鏈條,能讓多個控件處理同一個觸摸事件
4>簡要敘述響應者鏈條的往上傳遞,找到上一個響應者(nextResponder)
新聞熱點
疑難解答