觸控螢幕是ios裝置接受使用者輸入的主要方式,包括單擊、雙擊、撥動以及多點觸控等,這些操作都會產生觸控事件。
在cocoa中,代表觸控物件的類是
uitouch
。當使用者觸控螢幕幕後,就會產生相應的事件,所有相關的uitouch物件都被包裝在事件中,被程式交由特定的物件來處理。uitouch物件直接包括觸控的詳細資訊。
uitouch
類中包含5個屬性:
window
: 觸控產生時所處的視窗。由於視窗可能發生變化,當前所在的視窗不一定是最開始的視窗。
view
:
觸控產生時所處的檢視。由於檢視可能發生變化,當前檢視也不一定時最初的檢視。
tapcount
:輕擊(tap)操作和滑鼠的單擊操作類似,tapcount表示短時間內輕擊螢幕的次數。因此可以根據tapcount判斷單擊、雙擊或更多的輕擊。
timestamp:
時間戳記錄了觸控事件產生或變化時的時間。單位是秒。
phase
: 觸控事件在螢幕上有乙個週期,即觸控開始、觸控點移動、觸控結束,還有中途取消。通過phase可以檢視當前觸控事件在乙個週期中所處的狀態。
phase是
uitouchphase
型別的,這是乙個列舉配型,包含了:
uitouchphasebegan
(觸控開始)
uitouchphasemoved
(接觸點移動)
uitouchphasestationary
(接觸點無移動)
uitouchphaseended
(觸控結束)
uitouchphasecancelled
(觸控取消)
uitouch
類中包含如下成員函式:
- (cgpoint)locationinview:(uiview *)view
:函式返回乙個cgpoint型別的值,表示觸控在view這個檢視上的位置,這裡返回的位置是針對view的座標系的。呼叫時傳入的view引數為空的話,返回的時觸控點在整個視窗的位置。
- (cgpoint)previouslocationinview:(uiview *)view
:該方法記錄了前乙個座標值,函式返回也是乙個cgpoint型別的值, 表示觸控在view這個檢視上的位置,這裡返回的位置是針對view的座標系的。呼叫時傳入的view引數為空的話,返回的時觸控點在整個視窗的位置。
當手指接觸到螢幕,不管是單點觸控還是多點觸控,事件都會開始,直到使用者所有的手指都離開螢幕。期間所有的uitouch物件都被包含在
uievent
事件物件中,由程式分發給處理者。事件記錄了這個週期中所有觸控物件狀態的變化。
關於響應者的概念,通過以下幾點說明:
響應者物件(response object)
第一響應者(first responder):
當前接受觸控的響應者物件被稱為第一響應者,即表示當前該物件正在與使用者互動,它是響應者鏈的開端。
響應者鏈(responder chain
):響應者鏈表示一系列的響應者物件。事件被交由第一響應者物件處理,如果第一響應者不處理,事件被沿著響應者鏈向上傳遞,交給下乙個響應者(next responder)。一般來說,第一響應者是個檢視物件或者其子類物件,當其被觸控後事件被交由它處理,如果它不處理,事件就會被傳遞給它的檢視控制器物件(如果存在),然後是它的父檢視(superview)物件(如果存在),以此類推,直到頂層檢視。接下來會沿著頂層檢視(
top view
管理事件分發
檢視對觸控事件是否需要作處回應可以通過設定檢視的
userinteractionenabled
beginingnoringinteractionevents
方法來完全停止事件接收和分發。通過
endingnoringinteractionevents
方法來恢復讓程式接收和分發事件。
如果要讓檢視接收多點觸控,需要設定它的
multipletouchenabled
屬性為yes,預設狀態下這個屬性值為no,即檢視預設不接收多點觸控。
處理使用者的觸控事件
首先觸控的物件是檢視,而檢視的類uiview繼承了uirespnder類,但是要對事件作出處理,還需要重寫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;
當手指接觸螢幕時,就會呼叫touchesbegan:withevent方法;
當手指在螢幕上移時,動就會呼叫touchesmoved:withevent方法;
當手指離開螢幕時,就會呼叫touchesended:withevent方法;
當觸控被取消(比如觸控過程中被來電打斷),就會呼叫touchescancelled:withevent方法。而這幾個方法被呼叫時,正好對應了uitouch類中phase屬性的4個列舉值。
上面的四個事件方法,在開發過程中並不要求全部實現,可以根據需要重寫特定的方法。對於這4個方法,都有兩個相同的引數:nsset型別的touches和uievent型別的event。其中touches表示觸控產生的所有uitouch物件,而event表示特定的事件。因為uievent包含了整個觸控過程中所有的觸控物件,因此可以呼叫alltouches方法獲取該事件內所有的觸控物件,也可以呼叫touchesforview:或者touchesforwindows:取出特定檢視或者視窗上的觸控物件。在這幾個事件中,都可以拿到觸控物件,然後根據其位置,狀態,時間屬性做邏輯處理。
下面是移動某乙個試圖內的子檢視的小動畫的實現效果,**不全,精髓在其中:
[html]
view plain
copy
-(void)touchesbegan:(nsset *)touches withevent:(uievent *)event
-(void)touchesmoved:(nsset *)touches withevent:(uievent *)event
}
可以根據自己的需求對上面的**進行修改。
下面是在ios開發中常見的功能。即touch移動事件,是移動到當前檢視的子檢視中,還是移動到當前檢視以外了。
辦法是,繼承uiview,覆蓋touchesmoved方法:
[html]
view plain
copy
- (void)touchesmoved:(nsset *)touches withevent:(uievent *)eventelse else
}
}
UI 事件處理UITouch
一 事件的基本概念 uievent 事件,是由硬體捕捉的 個表 使用者操作裝置的物件。分三類 觸控事件 晃動事件 遠端控制事件 觸控事件 戶通過觸控裝置螢幕操作物件 輸 資料。持多點觸控,包含1個到多個觸控點 二 觸控的基本概念 1 實現觸控 uiview 持觸控事件 因為繼承於uiresponde...
UI 事件處理UITouch
在uiresponder父類中封裝著4個事件處理方法 1 void touchesbegan nsset touches withevent uievent event 2 void touchesmoved nsset touches withevent uievent event 3 void ...
UITouch事件處理過程詳解
3 uiresponder 內部提供了方法,處理不同型別的事件 2.處理事件的方法 處理觸控事件 1 void touchesbegan withevent 2 void touchesmoved withevent 3 void touchesended withevent 4 void touc...