iOS中的事件,手勢識別

2021-07-09 04:29:58 字數 3914 閱讀 4444

ios中的事件可以分為三大型別:

1.觸控事件

觸控事件的傳遞是從父控制項到子控制項,如果父控制項不能接收觸控事件,那麼子控制項就不可能接收到觸控事件

不能接收觸控事件的幾種情況:1.userinteractionenabled = no; 2.hidden = yes; 3.alpha = 0.0--0.01

//touches中存放的是uitouch物件

//觸控事件

- (void)touchbegin:(nsset *)touches withevent:(uievent *)event

- (void)touchmoved:(nsset *)touches withevent:(uievent *)event

- (void)touchended:(nsset *)touches withevent:(uievent *)event

//比如有**呼入,會導致觸控事件停止,這時候會呼叫該方法

- (void)touchcancelled:(nsset *)touched withevent:(uievent *)event

//一次完整的觸控過程,會經歷3個狀態:

//觸控開始:- (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

//4個觸控事件處理方法中,都有nsset *touches和uievent *event兩個引數

//一次完整的觸控過程中,只會產生乙個事件物件,4個觸控方法都是同乙個event引數

//如果兩根手指同時觸控乙個view,那麼view只會呼叫一次touchesbegan:withevent:方法,touches引數中裝著2個uitouch物件

//如果這兩根手指一前一後分開觸控同乙個view,那麼view會分別呼叫2次touchesbegan:withevent:方法,並且每次呼叫時的touches引數中只包含乙個uitouch物件

//根據touches中uitouch的個數可以判斷出是單點觸控還是多點觸控

2.加速計事件

//加速劑事件

- (void)motionbegin:(uieventsubtype)motion withevent:(uievent *)event

- (void)motionended:(uieventsubtype)motion withevent:(uievent *)event;

- (void)motioncancelled:(uieventsubtype)motion withevent:(uievent *)event;

3.遠端控制事件

- (void)remotecontrolreceivedwithevent:(uievent *)event;

只有繼承了uiresponder的物件才可以接受並處理事件,又叫「響應者物件」

uitouch 的一些屬性

widow 觸控產生所在的視窗

view  觸控產生所在的檢視

tapcount 短時間內點按螢幕的次數

timestamp 記錄了觸控產生或者變化的時間

phase 觸控事件所處的狀態

uitouchphase是乙個列舉型別,包含:

uitouchphasebegan(觸控開始)

uitouchphasemoved(接觸點移動)

uitouchphasestationary(接觸點無移動)

uitouchphaseended(觸控結束)

uitouchphasecancelled(觸控取消)

- (cgpoint)locationinview:(uiview *)view;

//返回值表示觸控在view上的位置

//這裡返回的位置是針對view的座標系的(以view的左上角為原點(0, 0))

//呼叫時傳入的view引數為nil的話,返回的是觸控點在uiwindow的位置

- (cgpoint)previouslocationinview:(uiview *)view;

//該方法記錄了前乙個觸控點的位置

uievent
沒產生乙個事件,就是乙個uievent物件,記錄了事件產生的時間和型別
//常見屬性

//事件型別

@property(nonatomic,readonly) uieventtype type;

@property(nonatomic,readonly) uieventsubtype subtype;

/*

typedef ns_enum(nsinteger, uieventtype) ;

typedef ns_enum(nsinteger, uieventsubtype) ;

*///事件產生的時間

@property(nonatomic,readonly) nstimeinterval timestamp;

//手勢識別
利用uigesturerecognizer,能輕鬆識別使用者在某個view上面做的一些常見手勢

uigesturerecognizer是乙個抽象類,定義了所有手勢的基本行為,使用它的子類才能處理具體的手勢

uitapgesturerecognizer(敲擊)

uipinchgesturerecognizer(捏合,用於縮放)

uipangesturerecognizer(拖拽)

uiswipegesturerecognizer(輕掃)

uirotationgesturerecognizer(旋轉)

uilongpressgesturerecognizer(長按)

使用:

//建立手勢識別器物件

uitapgesturerecognizer *tap = [[uitapgesturerecognizer alloc] init];

//設定手勢識別器物件的具體屬性

// 連續敲擊2次

tap.numberoftapsrequired = 2;

// 需要2根手指一起敲擊

tap.numberoftouchesrequired = 2;

//新增手勢識別器到對應的view上

[self.iconview addgesturerecognizer:tap];

//監聽手勢的觸發

[tap addtarget:self action:@selector(tapiconview:)];

typedef ns_enum(nsinteger, uigesturerecognizerstate) ;

iOS 手勢識別

首先給大家解釋一下為什麼要學習手勢識別?如果想監聽乙個uiview上面的觸控事件,之前的做法是 自定義乙個uiview 實現uiview的touches方法,在方法裡面實現具體功能 透過touches監聽uiview的觸控事件,有很明顯的幾個缺點 1.必須要自定義uiview,2.由於是在view內...

IOS開發之 事件處理 手勢識別 71

ios3.2之後,蘋果推出了手勢識別功能 guesture recognizer 在觸控事件處理方面,大大簡化了開發者的開發難度 uigesturerecognizer是乙個抽象類,定義了所有手勢的基本行為,使用它的子類才能處理具體的手勢 手勢uitapgesturerecognizer tap u...

iOS手勢識別初探

uigesturerecognizerstate的定義如下 typedef ns enum nsinteger,uigesturerecognizerstate uigesturerecognizerstatepossible 預設狀態,手勢識別器尚未識別出手勢,但是可能已經在處理觸屏事件了。uig...