前言
我想做一件事驰徊,把Event Handling Guide for iOS官方文檔翻譯成中文庶诡。起初是因?yàn)槲蚁胍宄OS中的響應(yīng)者鏈惦银,網(wǎng)上各種文章與我的理解和Demo實(shí)踐有所差異,于是我想去看看最權(quán)威的解釋末誓。 然而當(dāng)我看到70多頁(yè)的英文文檔時(shí)扯俱,不知從何處入手,于是我決定翻譯成自己喜歡的風(fēng)格喇澡,以后也可以看看迅栅。
有難度的事情,做起來(lái)才夠味兒晴玖。
對(duì)于翻譯的出入和錯(cuò)誤读存,希望大家包容和指正为流。下面就開(kāi)始啦。
關(guān)于iOS事件
用戶(hù)會(huì)以多種方式來(lái)操作iOS設(shè)備让簿,例如觸摸屏幕敬察、搖晃設(shè)備等。iOS系統(tǒng)將用戶(hù)如何尔当、何時(shí)操作設(shè)備的信息進(jìn)行解釋并發(fā)送到APP中莲祸。對(duì)于這些信息更加自然直觀的處理方式,會(huì)帶來(lái)更優(yōu)良的用戶(hù)體驗(yàn)椭迎。
總覽
用戶(hù)的操作會(huì)被封裝為Event對(duì)象發(fā)送給APP锐帜。在iOS系統(tǒng)中,Event有許多種形式畜号,譬如多點(diǎn)觸控事件缴阎、運(yùn)動(dòng)事件、多媒體控制事件弄兜。多媒體控制事件被通俗的理解為遠(yuǎn)程控制药蜻,因?yàn)樗苡赏饨拥脑O(shè)備所引發(fā)瓷式。
UIKit讓APP手勢(shì)識(shí)別變得簡(jiǎn)單
iOS應(yīng)用程序能識(shí)別復(fù)雜手勢(shì)并以直觀的方式呈現(xiàn)給用戶(hù)替饿,例如內(nèi)容的縮放、拖拽手勢(shì)贸典,以及內(nèi)容的滾動(dòng)视卢、輕掃手勢(shì)。實(shí)際上廊驼,許多手勢(shì)以類(lèi)似的方式建立于UIKit据过。例如,UIControl的子類(lèi)UIButton妒挎、UISlider绳锅,分別響應(yīng)特定的手勢(shì)——點(diǎn)擊和拖拽,當(dāng)你配置這些控件時(shí)酝掩,它們都會(huì)在觸摸觸發(fā)時(shí)向目標(biāo)對(duì)象發(fā)送動(dòng)作信息鳞芙。你亦可以將目標(biāo)-動(dòng)作機(jī)制運(yùn)用于視圖上的手勢(shì)識(shí)別器。當(dāng)你為視圖添加手勢(shì)識(shí)別器后期虾,整個(gè)視圖如同control一般原朝,能響應(yīng)你所指定的手勢(shì)。
手勢(shì)識(shí)別器為復(fù)雜的事件處理邏輯提供了高層次的抽象镶苞。手勢(shì)識(shí)別器是APP中實(shí)現(xiàn)事件處理的首選方式喳坠,因?yàn)樗鼜?qiáng)大、復(fù)用性強(qiáng)茂蚓、適應(yīng)性強(qiáng)壕鹉。你能使用任何一種內(nèi)置的手勢(shì)并自定義它的行為剃幌,你也可以創(chuàng)建你自己的手勢(shì)識(shí)別器來(lái)識(shí)別新的手勢(shì)。
通過(guò)指定的路徑尋找處理Event的對(duì)象
當(dāng)iOS系統(tǒng)識(shí)別到Event晾浴,便將它傳遞給最有可能處理事件的初始化對(duì)象锥忿,例如觸摸發(fā)生的視圖。倘若初始化對(duì)象并不能處理事件怠肋,iOS系統(tǒng)則會(huì)繼續(xù)在更大的范圍內(nèi)傳遞事件以尋找能處理事件的對(duì)象敬鬓。這些對(duì)象的序列被稱(chēng)之為響應(yīng)者鏈,iOS系統(tǒng)除了沿著這條鏈條傳遞事件笙各,也會(huì)傳遞處理事件的義務(wù)钉答。這種設(shè)計(jì)模式令事件處理顯得靈動(dòng)和協(xié)同。
UIEvent對(duì)象可以封裝諸如觸摸杈抢、搖晃数尿、遠(yuǎn)程控制事件等
大多數(shù)事件對(duì)象是UIEvent類(lèi)的實(shí)例。APP通過(guò)UIEvent對(duì)象包含的事件信息來(lái)決定如何響應(yīng)事件惶楼。例如右蹦,當(dāng)手觸摸屏幕并在屏幕上移動(dòng),接下來(lái)iOS系統(tǒng)將發(fā)送事件給APP處理歼捐,每一個(gè)事件都有一個(gè)主類(lèi)型和子類(lèi)型何陆,而主類(lèi)型包括觸摸、搖晃豹储、遠(yuǎn)程控制等贷盲。
當(dāng)用戶(hù)觸摸視圖,APP會(huì)收到多點(diǎn)觸控事件
基于你的APP剥扣,UIKit有足夠多的控件和手勢(shì)識(shí)別器來(lái)為你處理所有的觸摸事件巩剖。即便是自定義視圖,你也可以使用手勢(shì)識(shí)別器钠怯。一般說(shuō)來(lái)佳魔,當(dāng)APP的觸摸響應(yīng)與視圖本身高度的耦合時(shí),你會(huì)自定義事件的處理晦炊,例如通過(guò)觸摸進(jìn)行繪制鞠鲜。在這種情況下,你需要負(fù)責(zé)底層的事件處理刽锤,你會(huì)實(shí)現(xiàn)觸摸相關(guān)聯(lián)的方法镊尺,并在這些方法中分析原生的觸摸事件并做出合適的響應(yīng)。
當(dāng)用戶(hù)移動(dòng)設(shè)備并思,APP會(huì)收到運(yùn)動(dòng)事件
運(yùn)動(dòng)事件會(huì)提供設(shè)備的位置庐氮、方向、移動(dòng)等信息宋彼。通過(guò)對(duì)運(yùn)動(dòng)事件的處理弄砍,你可以為你的APP添加巧妙而又強(qiáng)大的功能仙畦。加速器和陀螺儀數(shù)據(jù)可以讓你監(jiān)測(cè)傾斜、轉(zhuǎn)動(dòng)和搖動(dòng)音婶。
運(yùn)動(dòng)事件來(lái)源于不同的形式慨畸,因此你也可以通過(guò)不同的框架進(jìn)行處理。當(dāng)用戶(hù)搖晃手機(jī)衣式,UIKit發(fā)送UIEvent對(duì)象到APP中寸士。 如果你想要接收高頻率、持續(xù)的加速器和陀螺儀數(shù)據(jù)碴卧,則可以使用Core Motion框架弱卡。
當(dāng)用戶(hù)進(jìn)行多媒體控制,APP會(huì)收到遠(yuǎn)程控制事件
iOS系統(tǒng)控件和外接設(shè)備進(jìn)行的多媒體控制將會(huì)發(fā)送遠(yuǎn)程控制事件到APP住册。用戶(hù)通過(guò)這些事件來(lái)控制音頻和視頻婶博,例如通過(guò)耳機(jī)調(diào)整音量。對(duì)于多媒體遠(yuǎn)程控制事件的處理將使你的APP能夠響應(yīng)諸如此類(lèi)的命令荧飞。
預(yù)備知識(shí)
這篇文檔基于你已熟悉以下知識(shí)點(diǎn):
- 基本的iOS APP開(kāi)發(fā)概念
- 不同的用戶(hù)界面開(kāi)發(fā)方式
- 視圖與視圖控制器的工作凡人、自定義方式
如果你還不熟悉這些概念,請(qǐng)先閱讀Start Developing iOS Apps Today叹阔。并確保閱讀了View Programming Guide for iOS和View Controller Programming Guide for iOS;
參見(jiàn)
iOS設(shè)備以同樣的方式提供了觸摸和運(yùn)動(dòng)的數(shù)據(jù)挠轴,而大多數(shù)的iOS設(shè)備都有GPS和指南針相關(guān)的硬件,由此生成APP可能感興趣的底層數(shù)據(jù)条获。Location Awareness Programming Guide討論了如何接收和處理位置數(shù)據(jù)忠荞。
更加高級(jí)的手勢(shì)識(shí)別器技術(shù),例如平滑曲線(xiàn)和低通濾波器帅掘,請(qǐng)參見(jiàn)WWDC 2012: Building Advanced Gesture Recognizers .;
許多使用手勢(shì)識(shí)別器和事件處理的示例代碼可以查閱iOS 參考庫(kù)。以下項(xiàng)目包含了這些示例代碼:
Simple Gesture Recognizers是理解手勢(shì)識(shí)別的啟蒙課堂油。這些APP示范了如何去識(shí)別點(diǎn)擊修档、輕掃和旋轉(zhuǎn)手勢(shì)。并能夠讓展示和動(dòng)畫(huà)的圖片對(duì)觸摸事件做出響應(yīng)府框。
Touches包含了兩個(gè)項(xiàng)目吱窝,分別示范了如何使用多點(diǎn)觸控和在屏幕內(nèi)拖拽區(qū)域。一個(gè)版本使用手勢(shì)識(shí)別器迫靖,另一個(gè)則使用觸摸事件的處理方法院峡。后一個(gè)版本對(duì)于理解觸摸的階段尤其有用,因?yàn)樗故玖擞|摸發(fā)生時(shí)所產(chǎn)生的不同階段系宜。
MoveMe展現(xiàn)了如何讓一個(gè)動(dòng)畫(huà)的視圖響應(yīng)觸摸事件照激,分析這個(gè)簡(jiǎn)單的項(xiàng)目能讓你更進(jìn)一步的理解自定義的事件處理。