天天看點

《iOS創意程式設計家》——第6.4節事件檢測

本節書摘來自異步社群《ios創意程式設計家》一書中的第6章,第6.4節事件檢測,作者 林柏全,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

6.4 事件檢測

ios創意程式設計家

界面控制器除了負責界面的管理以及布局外,還負責事件的傳遞。這些事件包括我們在第5章已經介紹過的觸控事件,還有接下來要介紹的晃動檢測事件。這些事件都定義在uiresponder類裡面,而無論是界面控制器uiviewcontroller還是界面uiview,它們都繼承自uiresponder類。

6.4.1 晃動檢測

首先,我們來看看晃動事件的處理。與觸控事件類似的是,晃動檢測也是由一連串的事件所組成的,不過,要讓您的應用程式支援晃動檢測,必須讓您的界面控制器成為first responder才行。要讓某個界面控制器成為first responder,除了調用becomefirstresponder這個方法外,還需要改寫canbecomefirstresponder這個方法,并傳回yes,使得這個界面控制器可以成為first responder,使用代碼如下所示:

搖晃您的手機看看uiviewcontroller是否可以接收到這些事件。

6.4.2 應用範例:魔術秀

有了以上的搖晃事件的說明後,我們可以很容易地運用這個事件來做一些應用。例如,我們可以将搖晃事件運用于魔術上。當然,這個魔術隻需要有一點點的表演天分,而不需要有任何魔術的技巧。這個魔術的表演過程是這樣的,首先讓任何一位觀衆看看手機上出現的3張牌,當然,由系統随機出現的這3張牌都是a的機率是非常小的。為了取信觀衆,您甚至可以讓觀衆任意觸摸界面上的這3張牌。保持手部不觸控到螢幕界面,然後在觀衆面前用力往下一甩,您會發現界面上的3張牌全部變成了a,再甩一次,界面中的3張牌又會恢複到觀衆原先看到的那3張牌了。通過以下的步驟,我們就可以實作這個魔術秀的應用程式。

學習重點:

outlet collection的使用;

晃動檢測;

随機數的使用;

動畫的使用。

請記得勾選“use storyboard”以及“use automatic reference counting”選項,并将撲克牌等圖形檔案加入到項目内。

打開mainstoryboard.storyboard,并在界面上加入3個uiimageview的控件。然後指定這3張圖形為撲克牌的背面圖cover.png。

請注意,這3張撲克牌的順序會因為加入uiimageview的順序不同而有所不同,先加入的控件會放在下面,如圖6.14所示。如果有需要的話,也可以通過xcode選單上的“editor”→“arrange”來調整前後位置。

《iOS創意程式設計家》——第6.4節事件檢測

接下來,我們得将撲克牌連接配接為outlet。與以往不同的是,我們要将這3種牌連接配接為outlet collection以友善後續的處理。連接配接的方式與outlet一樣,首先,将第1張牌連接配接為一個outlet collection,并命名為“poker”,接着分别将第2張與第3張連接配接到相同的outlet collection中就可以了。現在viewcontroller.m看起來應該如下所示:

我們需要兩個變量來記錄發牌的狀态,并且要定義一個發牌方式的自定義變量形态。其中,ischeat用來記錄目前是否是3張a狀态,而oldpokers則用來記錄原先發的牌以友善後續我們可以還原回去。

現在為魔術秀加入搖晃事件的支援。要讓一個界面控制器支援搖晃事件的第一步就是,先讓這個界面控制器可以成為first responder。是以,我們要在viewcontroller.m裡面加入以下的方法:

接下來,我們可以去處理初始發牌以及搖晃後換牌的程式代碼。在以下的程式代碼中,我們通過ischeat來判斷目前是否需要更換為3張a的狀态,如果需要的話,就通過dealpokerswithoption:cheat來更換,否則就通過dealpokerswithoption :restore還原回去,使用代碼如下:

上述的程式代碼通過“(arc4random() % 13) + 1”這一行程式代碼來取得随機數所決定的撲克牌号碼。通過這個方式便可以讓随機數所決定的撲克牌号碼落在1到13之間。整個魔術秀的應用程式就是這麼簡單,最後,讓我們看一下魔術秀的表演,如圖6.15所示。

《iOS創意程式設計家》——第6.4節事件檢測

6.4.3 加速度計

加速度計(accelerometer)在iphone内扮演着很重要的角色,包括本節内容所介紹的搖晃事件其實也是加速度計的一個應用。

如圖6.16所示,ios的加速度計是由3個軸向所構成的。也就是說,它可以測量3個方向的加速度值,而這個加速度值的機關就是大家在實體課所學到的重力加速度(1g=9.81 m/s2)。以圖6.16來說,當手機往右手邊旋轉時,這時候x軸的加速度值便會越來越大;相反地,則x軸的加速度值便會越來越小。

《iOS創意程式設計家》——第6.4節事件檢測

有了以上的概念後,我們來看看如何在應用程式内加入加速度的檢測。

首先,必須在類的定義中加入uiaccelerometerdelegate協定,例如:

最後則是加入加速度數值改變後的通知事件,使用代碼如下:

在這個事件内所傳入的acceleration參數便帶有x、y、z三個軸向的數值。例如:

6.4.4 應用範例:水準儀

由于加速度計本身的特性,我們可以利用得到的3個軸向的加速度值來做一些有趣的應用,例如,把ios裝置當作水準儀來使用。水準儀是一種用來檢驗一個物品是否呈現水準狀态的簡單儀器。常見的水準儀是氣泡式水準儀,這種水準儀裡面注滿了液體,但儀器中央會有一個小氣泡。該氣泡會随着待測的平面高度的變化而改變位置,若待測平面呈現水準狀态,則氣泡會位于儀器的正中央。對水準儀有了簡單的了解之後,我們便可以把ios裝置變成水準儀了。

加速度計的使用;

如何讓手機固定一個方向;

使用settransform:來移動對象。

在建立項目過程中,請記得勾選“use storyboard”以及“use automatic reference counting”選項。

由于在使用水準儀的時候不希望界面随着使用者的轉動而改變方向,我們要去設定該應用程式隻會固定在landscape left方向。請在targets設定中的info界面加入以下兩個設定,如圖6.17所示。

《iOS創意程式設計家》——第6.4節事件檢測

其中,supported interface orientations用來設定這部裝置可以支援的方向,而initial interface orientation則用來設定預設的方向。

最後,我們要到viewcontroller.m中來取消自動轉向的設定,代碼如下:

這樣一來,ios裝置就完全不會自動轉向了。現在執行一下應用程式,看看方向是否正确。

直接将水準儀與氣泡的圖形拉到項目中,并選擇“copy items into destination group's folder”以複制檔案到項目中。

打開mainstoryboard.storyboard,會發現手機的界面已經變成橫向顯示了。現在從控件庫中拉進兩個image view到界面中,其中一個為水準儀本身的圖形,另外一個則是氣泡的圖形。

為了精确定位,我們可以切換到尺寸觀測視窗(size inspector),并分别設定這兩個image view的位置與大小,例如,

水準儀:(240,160)高度65

氣泡:(240,160)寬度與高度均為30

接下來就可以在屬性觀測視窗(attribute inspector)分别為這兩個控件設定圖形了。完成後的界面應該如圖6.18所示。

《iOS創意程式設計家》——第6.4節事件檢測

由于我們需要變動氣泡的位置,是以,必須要将氣泡先連接配接為outlet以友善控制。選擇氣泡的圖形,并打開編輯器的輔助模式,按住“control”鍵不放,然後連接配接為bubble。

打開viewcontroller.h并在類定義的後面加上uiaccelerometerdelegate協定。viewcontroller.h應該如下所示:

在上述的程式代碼裡面,我們通過uiview的settransform:方法來改變氣泡的位置,由于x、y軸的正負值剛好與氣泡運動的位置相反,是以要乘以-1來改變。讀者們可以自行驗證這一點。程式最終的執行界面如圖6.19所示。

《iOS創意程式設計家》——第6.4節事件檢測

繼續閱讀