iOS 事件處理機(jī)制

在iOS中洛搀,事件被封裝成 UIEvent對(duì)象,主要有以下屬性

@property(nonatomic,readonly) UIEventType type; //事件類(lèi)型
@property(nonatomic,readonly)UIEventSubtype subtype;
@property(nonatomic,readonly)NSTimeInterval timestamp;//事件產(chǎn)生時(shí)間

事件分為以下三類(lèi)

1,觸摸事件 UIEventTypeTouches

2扣唱,運(yùn)動(dòng)事件 UIEventTypeMotion

3黍氮,遠(yuǎn)程控制事件 UIEventTypeRemoteControl

在iOS中并不是所有的類(lèi)都能處理接收并事件僧凤,只有繼承自UIResponder類(lèi)的對(duì)象(響應(yīng)者對(duì)象)才能處理事件,我們常用的UIView深浮、UIViewController蜻拨、UIApplication都繼承自UIResponder池充,它們都能接收并處理事件。

UIResponder 提供以下方法來(lái)處理事件

  • 觸摸事件
//一根或多根手指開(kāi)始觸摸view,系統(tǒng)會(huì)自動(dòng)調(diào)用view下面的方法:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
// 一根或者多根手指在view上移動(dòng)時(shí)缎讼,系統(tǒng)會(huì)持續(xù)的自動(dòng)調(diào)用view下面的方法:
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
//一根或者多根手指離開(kāi)view收夸,系統(tǒng)會(huì)自動(dòng)調(diào)用view下面的方法:
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
//觸摸結(jié)束前,某個(gè)系統(tǒng)事件(例如電話呼入)會(huì)打斷觸摸過(guò)程血崭,系統(tǒng)會(huì)自動(dòng)調(diào)用view下面的方法
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event

當(dāng)用戶(hù)用一根手指觸摸屏幕時(shí)卧惜,會(huì)創(chuàng)建一個(gè)與手指相關(guān)聯(lián)的 UITouch 對(duì)象,主要有以下屬性:

@property(nonatomic,readonly,retain)UIWindow *window; //觸摸產(chǎn)生時(shí)所處的窗口
@property(nonatomic,readonly,retain)UIView *view;//觸摸產(chǎn)生時(shí)所處的視圖
@property(nonatomic,readonly) NSUInteger tapCount;//點(diǎn)擊次數(shù)
@property(nonatomic,readonly)NSTimeInterval timestamp;//觸摸產(chǎn)生時(shí)間
@property(nonatomic,readonly)UITouchPhase phase;//觸摸所處狀態(tài)

UITouch與UIEvent
  • 運(yùn)動(dòng)事件
 //運(yùn)動(dòng)開(kāi)始
 -(void)motionBegan:(UIEventSubtype)motionwithEvent:(UIEvent*)event
//運(yùn)動(dòng)結(jié)束
-(void)motionEnded:(UIEventSubtype)motionwithEvent:(UIEvent*)event
//運(yùn)動(dòng)被取消
-(void)motionCancelled:(UIEventSubtype)motionwithEvent:(UIEvent*)event
  • 遠(yuǎn)程控制事件事件
//接收到遠(yuǎn)程控制消息
-(void)remoteControlReceivedWithEvent:(UIEvent*)event
觸摸事件處理機(jī)制

對(duì)于UIView,有三種情況不接受觸摸事件

  • userInteractionEnable = NO;
  • hidden = YES;;
  • alpha = 0.0~0.01;

當(dāng)發(fā)生觸摸時(shí)厘灼,系統(tǒng)會(huì)封裝一個(gè)事件,事件會(huì)加入到UIApplication事件隊(duì)列咽瓷,通常分發(fā)給應(yīng)用程序主窗口(window)



主窗口會(huì)通過(guò)以下方法從視圖結(jié)構(gòu)尋找合適的視圖

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

例如用戶(hù)點(diǎn)擊了 View E


尋找過(guò)程為

從 View A 的 Subview View B 與 View C 中尋找设凹,
發(fā)現(xiàn)在View C 內(nèi),再?gòu)腣iew D 與 View E中尋找
在View E內(nèi)

因此茅姜,事件的傳遞過(guò)程為:UIApplication->Window->View A->View C->view E

事件的響應(yīng)鏈 The Responder Chain
iOS_responder_chain

如果初始化對(duì)象(initial object)—— 即initial view 不處理事件(處理事件通過(guò)touches..方法響應(yīng))闪朱,UIKit會(huì)將事件傳遞給responder chain的下一個(gè)responder。每個(gè)responder決定它是傳遞事件還是通過(guò)nextResponder方法傳遞給它的下一個(gè)responder钻洒。這個(gè)操作繼續(xù)直到UIApplication奋姿,然后廢棄。

參考文檔

About Events in iOS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末素标,一起剝皮案震驚了整個(gè)濱河市称诗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌头遭,老刑警劉巖寓免,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異任岸,居然都是意外死亡再榄,警方通過(guò)查閱死者的電腦和手機(jī)狡刘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)享潜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嗅蔬,你說(shuō)我怎么就攤上這事剑按。” “怎么了澜术?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵艺蝴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鸟废,道長(zhǎng)猜敢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任盒延,我火速辦了婚禮缩擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘添寺。我一直安慰自己胯盯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布计露。 她就那樣靜靜地躺著博脑,像睡著了一般憎乙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叉趣,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天泞边,我揣著相機(jī)與錄音,去河邊找鬼君账。 笑死繁堡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乡数。 我是一名探鬼主播椭蹄,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼净赴!你這毒婦竟也來(lái)了绳矩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤玖翅,失蹤者是張志新(化名)和其女友劉穎翼馆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體金度,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡应媚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猜极。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片中姜。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跟伏,靈堂內(nèi)的尸體忽然破棺而出丢胚,到底是詐尸還是另有隱情,我是刑警寧澤受扳,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布携龟,位于F島的核電站,受9級(jí)特大地震影響勘高,放射性物質(zhì)發(fā)生泄漏峡蟋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一华望、第九天 我趴在偏房一處隱蔽的房頂上張望蕊蝗。 院中可真熱鬧,春花似錦立美、人聲如沸匿又。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碌更。三九已至裕偿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痛单,已是汗流浹背嘿棘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旭绒,地道東北人鸟妙。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挥吵,于是被迫代替她去往敵國(guó)和親重父。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容