? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ios觸摸事件 ? ? ? ??
一、前言
在App開(kāi)發(fā)過(guò)程中,需要利用手勢(shì)去實(shí)現(xiàn)一些功能或者效果俊卤。UIKit框架提供了檢測(cè)常見(jiàn)手勢(shì)的預(yù)定義手勢(shì)識(shí)別器搭盾。在手勢(shì)開(kāi)發(fā)上,最好使用預(yù)定義的手勢(shì)識(shí)別器,因?yàn)樗鼈兊暮?jiǎn)單性減少了我們的代碼量。當(dāng)然,我們也可以自定義一些特殊的手勢(shì)急波,具體的可以查看官方文檔。ios中事件可以分為3大類型:觸摸事件瘪校、加速器事件澄暮、遠(yuǎn)程控制事件,如下圖所示:
二、UIResponder
在ios中不是任何對(duì)象都能處理事件,只要繼承了UIResponder的對(duì)象才能接收并處理事件渣淤。我們稱之為"響應(yīng)者對(duì)象",UIApplication,UIController,UIView都繼承自UIResponder,因此它們都是響應(yīng)者對(duì)象赏寇,都能接收并處理事件。
UIResponder提供了以下方法來(lái)處理事件:
三价认、UITouch
當(dāng)用戶一根手指頭觸摸到屏幕時(shí),會(huì)創(chuàng)建一個(gè)與手指相關(guān)的UITouch對(duì)象,一根手指對(duì)應(yīng)一個(gè)UITouch對(duì)象嗅定。
UITouch保存著與手指相關(guān)的信息, 比如觸摸的位置,時(shí)間,階段:
(1)當(dāng)手指移動(dòng)的時(shí)候,系統(tǒng)會(huì)更新同一個(gè)UITouch對(duì)象,使之能一直保存該手指在的觸摸位置。
(2)當(dāng)手指離開(kāi)屏幕的時(shí)候,系統(tǒng)會(huì)銷毀相應(yīng)的UITouch對(duì)象用踩。
UITouch的屬性:
其中,UITouchPhase是一個(gè)枚舉類型渠退、包括:
UITouch的方法:
四:UIEvent
每產(chǎn)生一個(gè)事件,就會(huì)產(chǎn)生一個(gè)UIEvent對(duì)象,記錄事件產(chǎn)生的時(shí)刻和類型脐彩。
UIEvent屬性:
五:事件的產(chǎn)生和傳遞
發(fā)生觸摸事件后,系統(tǒng)會(huì)將事件加入到一個(gè)由UIApplication管理的事件隊(duì)列中,UIApplication會(huì)從事件隊(duì)列中取出最前面的事件,并將事件分發(fā)下去以便處理碎乃。通常,先發(fā)送事件給程序的主窗口(keywindow),主窗口會(huì)在視圖層級(jí)中找到一個(gè)最合適的視圖來(lái)處理觸摸事件,也就是說(shuō)keywindow最先收到觸摸事件。找到合適的視圖后,就會(huì)調(diào)用視圖控件的touches方法來(lái)做具體的事件處理:
touchesBegan…
touchesMoved…
touchedEnded…
這些touches方法的默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞,將事件傳給上一個(gè)響應(yīng)者進(jìn)行處理惠奸。示例如下:
觸摸事件的傳遞是從父控件傳遞到子控件的:
(1)點(diǎn)擊了綠色的view
UIApplication-->UIWindow-->白色-->綠色
(2)點(diǎn)擊了藍(lán)色的view
UIApplication-->UIWindow-->白色-->橙色-->藍(lán)色
(3)點(diǎn)擊了黃色的view
UIApplication-->UIWidow-->白色-->橙色-->藍(lán)色-->黃色
注意:如果父視圖不能接收觸摸事件,那么子視圖就不可能接收觸摸事件梅誓。
UIView不接收觸摸事件的三種情況:
(1)不接收用戶交互
userInteractionEnabled = NO
(2)隱藏
hidden = YES
(3)透明
alpha = 0.0~0.01
六:響應(yīng)者鏈條
響應(yīng)者鏈條示意圖:
(1)如果view的控制器存在,就傳遞給控制器;如果控制器的view不存在,則將其傳遞給它的父視圖。
(2)在視圖層次結(jié)構(gòu)的最頂級(jí)視圖,如果不能處理接收的事件,那么會(huì)將事件傳遞給Window處理梗掰。
(3)如果window也不處理事件,就將事件傳遞給UIApplication處理嵌言。
(4)如果UIApplication也不處理該事件,則丟棄該事件。
注:更多細(xì)節(jié)處理可參考文章觸摸事件詳解