觸控事件UITouch的用法

2021-08-13 19:17:53 字數 3571 閱讀 6633

觸控螢幕是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...