在IOS開發中會遇到各種操作事件,通過程式可以對這些事件做出響應。
首先,當發生事件響應時,必須知道由誰來響應事件。在IOS中,由響應者鏈來對事件進行響應,所有事件響應的類都是UIResponder的子類,響應者鏈是一個由不同對象組成的階層,其中的每個對象將依次獲得響應事件訊息的機會。當發生事件時,事件首先被發送給第一響應者,第一響應者往往是事件發生的視圖,也就是使用者觸控螢幕幕的地方。事件將沿著響應者鏈一直向下傳遞,直到被接受並做出處理
路線圖如 First Responser——>The Window——>The Application——>App Delegate
正常的響應者鏈流程經常被委託(delegation)打斷,一個對象(通常是視圖)可能將響應工作委託給另一個對象來完成(通常是視圖控制器ViewController),這就是為什麼做事件響應時在ViewController中必須實現相應協議來實現事件委託。
1.觸摸和事件
——UITouch
UITouch對象是一個手指接觸到螢幕並在螢幕上移動或離開螢幕時建立的。它有幾個屬性和執行個體方法:
phase:屬性,返回一個階段常量,指出觸摸開始、繼續、結束或被取消,分別對應UITouchPhaseBegan、UITouchPhaseMoved等
tapCount:屬性,輕按螢幕的次數
timeStamp:屬性,觸摸發生的時間
view:屬性,觸摸始於那個視圖
window:屬性,觸摸始於哪個視窗
lacationInView:方法,觸摸在指定視圖中的當前位置
previousLocationView:方法,觸摸在指定視圖中的前一個位置
——UIEvent
UIEvent對象包含一組相關的UITouch對象,由UITouch對象組成UIEvent對象,可以理解成一個完整的觸摸操作是一個UIEvent,而這一系列完整操作中的每個點就是UITouch(按下、移動、離開)。
UIEvent的作用是提供相關觸摸操作的列表,如果要擷取在螢幕上觸摸的手勢,可以使用該對象,這一些列操作都儲存在Foundation架構中的NSSet對象中。
——UIResponder
UIResponser提供四個事件響應的方法,這些方法是事件捕捉的核心。這些方法都接收兩個參數,一個是NSSet(包含指定階段的觸摸)和一個UIEvent。
touchesBegan:withEvent: 在手指觸控螢幕幕時報告UITouchPhaseBegan事件
touchesMoved:withEvent: 在手指在螢幕上移動時報告UITouchPhaseMoved事件
touchesEnded:withEvent: 在手指離開螢幕時報告UITouchPhaseEnded事件
touchesCancelled:withEvent: 在因電話中或其他因素導致取消觸摸時報告UITouchPhaseCancelled事件
定義一個方法用來響應觸摸事件:
-(void)manageTouches:(NSSet *)touches{ for (UITouch *touch in touches) { switch (touch.phase) { caseUITouchPhaseBegan: NSLog(@"began..."); break; caseUITouchPhaseMoved: NSLog(@"move..."); break; caseUITouchPhaseEnded: NSLog(@"end..."); break; default: break; } }}
然後在ViewController中響應該方法:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
關於多點觸摸,可以參考Apple IOS SDK開發文檔,多點觸摸在遊戲及其一些新奇的應用中比較多,在常規的應用開發中還是比較少的用到多點觸摸。
下次將介紹UIControl對象
加入我們的QQ群或公眾帳號請查看:Ryan's
zone公眾帳號及QQ群
歡迎關注我的新浪微博和我交流:@唐韌_Ryan