在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) {
case UITouchPhaseBegan:
NSLog(@"began...");
break;
case UITouchPhaseMoved:
NSLog(@"move...");
break;
case UITouchPhaseEnded:
NSLog(@"end...");
break;
case UITouchPhaseCancelled:
NSLog(@"cancel...");
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開發文檔,多點觸摸在遊戲及其一些新奇的應用中比較多,在常規的應用開發中還是比較少的用到多點觸摸。