本節書摘來自異步社群《ios 6進階開發手冊(第4版)》一書中的第1章,第1.7節同步擷取目前的加速計角度,作者 【美】erica sadun,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
1.7 同步擷取目前的加速計角度
ios 6進階開發手冊(第4版)
有時,你可能想在不用把自己設定為完全委托的情況下查詢加速計。下面的方法打算在uidevice類别内使用,允許與x/y平面(ios裝置的正面)一起同步傳回目前的裝置角度。為此,可輸入一個新的運作循環,等待加速計事件,從那個回調中擷取目前的角度,然後讓運作循環傳回那個角度:
這不是用于持續輪詢的方法,可為此直接使用回調。但是,對于偶爾的角度查詢,這些方法提供了對目前螢幕角度的簡單、直接的通路。
1.7.1 通過加速計計算方向
在第一次啟動應用程式時,uidevice類不會報告正确的方向。僅當裝置移到一個新位置或者uiviewcontroller方法起作用之後,它才會更新方向。
直到使用者把裝置移開然後再移回正确的方向之後,才可能會把縱向啟動的應用程式視作“縱向”的。在模拟器和iphone裝置上存在這種狀況,并且很容易測試(由于對特性進行了更新,使之像設計的那樣工作,是以關閉了針對這個問題的無線電探測器)。
對于解決辦法,可以考慮像剛才所示的那樣直接恢複角度方向。然後,在确定了裝置的角度之後,從基于加速計的角度轉換為裝置方向。下面用代碼說明了它的工作方式:
要知道的是,這個示例隻考慮了x-y平面,而大多數使用者界面決策都需要在這裡做出。這個代碼段完全忽略了z軸,這意味着最終将會得到模糊的随機結果:即正面朝上和正面朝下的方向。可以修改這段代碼,以根據需要提供這種細微差别。
uiviewcontroller類的interfaceorientation執行個體方法報告了視圖控制器的界面的方向。盡管這不能代替加速計讀數,但是許多界面布局問題都基于底層的視圖方向,而不是裝置特征。
還要知道的是,尤其是在ipad上,子視圖控制器使用的布局方向可能不同于裝置方向。例如,嵌入式控制器可能在一個橫向劃分的視圖控制器内展示一種縱向布局。即便如此,也可以考慮底層的界面方向是否可以滿足方向檢測代碼。它可能比裝置方向更可靠,尤其是在應用程式啟動時。
1.7.2 計算相對角度
螢幕重定向支援意味着必須在象限中支援界面對于給定裝置角度的關系,其中每個象限都用于一個可能的面向前方的螢幕方向。由于uiviewcontroller可以自動旋轉其螢幕上的視圖,需要了解一些數學知識以解釋那些重定向。
下面的方法(編寫它是為了在uidevice類别中使用)可以計算角度,以使得角度與裝置方向保持同步。這将在垂直方向上産生簡單的偏移,以比對目前展示gui的方式:
這個方法使用一個浮點模數擷取實際的螢幕角度與界面方向角度偏移量之間的內插補點,傳回非常重要的垂直角度偏移量。
注意:
{在ios 6中,可以使用info.plist代替shouldautorotatetointerfaceorientation:,以允許和禁止方向改變。}