天天看點

《iOS 6進階開發手冊(第4版)》——1.13節使用外部螢幕

本節書摘來自異步社群《ios 6進階開發手冊(第4版)》一書中的第1章,第1.13節使用外部螢幕,作者 【美】erica sadun,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.13 使用外部螢幕

ios 6進階開發手冊(第4版)

可以用許多方式使用外部螢幕。例如,采取最新款的ipad。第二代和第三代型号提供了内置的螢幕監測。連接配接vga或hdmi電纜,就可以把内容顯示在外部顯示器和内置螢幕上。某些裝置允許使用airplay(apple的專有無線纜空中下載下傳視訊解決方案)把螢幕以無線方式鏡像到apple tv。這些鏡像特性極其友善,但是并不僅限于在ios中簡單地把一個螢幕上的内容複制到另一個螢幕上。

uiscreen類允許獨立地檢測并寫到外部螢幕上。可以把任何連接配接的顯示器視作一個新視窗,并為該顯示器建立内容,使之獨立于主裝置螢幕上顯示的任何視圖。可以為任何有線螢幕執行該操作,并且從ipad 2(及更高型号)和iphone 4s(及更高型号)開始,可以使用airplay to apple tv 2(及更高型号)以無線方式執行該操作。名為reflector的第三方應用程式允許使用airplay把顯示器鏡像到mac或windows計算機。

幾何學很重要。為什麼呢?ios裝置目前包括320像素×480像素的老式iphone顯示器、640像素×960像素的retina顯示器單元和1024像素×768像素的ipad。典型的複合/分量輸出是在720像素×480像素(480i和480p)、1024像素×768像素和1280像素×720像素(720p)下的vga上産生的,然後還有更高品質的hdmi輸出可用。

除此之外,還有過掃描的問題及其他目标顯示器的局限性,并且video out會迅速變成一個幾何挑戰。幸運的是,apple利用一些友善的現實修改來響應這種挑戰。無需嘗試在輸出螢幕與内置的裝置螢幕之間建立一種一對一的關系,而可以基于輸出顯示器的可用屬性建構内容。隻需建立一個視窗,填充它,并顯示它。 如果打算開發video out應用程式,不要想當然地認為使用者會嚴格地使用airplay。許多使用者仍然使用老式的電纜接頭連接配接到顯示器和投影儀。確定每種電纜至少具有一根(複合、分量、vga和hdmi),還要具有準備好使用airplay的iphone和ipad,以便可以徹底地測試每種輸出配置。第三方電纜(通常是從遠東進口的,沒有打上made for iphone/ipad的标簽)将不會工作,是以要確定購買具有apple品牌的物品。

1.13.1 檢測螢幕

uiscreen類可以報告連接配接了多少個螢幕。你知道無論何時這個計數大于1,都會連接配接有外部螢幕。screens數組中的第一項總是主裝置螢幕:

每個螢幕都可以報告它的邊界(即它的實體尺寸,以磅為機關)以及它的螢幕比例(将磅與像素關聯起來)。兩個标準的通知使你能夠觀察螢幕何時連接配接到裝置以及與裝置斷開。

連接配接意指任意類型的連接配接,無論是通過電纜還是通過airplay。無論何時接收到這種類型的更新,都一定要統計螢幕數量,并調整使用者界面,以比對新的情況。

你的職責是:無論何時加入新螢幕,都要建立一些視窗,一旦發生分離事件,就要清除它們。每個螢幕都應該具有它自己的視窗,為輸出顯示器管理内容。對于分離的螢幕,不要抓住它們的視窗不放。釋放它們,然後當新螢幕出現時重新建立它們。

注意:

在screens數組中不會表示出鏡像的螢幕,而代之以将鏡像存儲在主螢幕的mirroredscreen屬性中。當禁用、未連接配接或者裝置的能力簡直不支援鏡像時,這個屬性為空。

建立一個新螢幕并把它用于獨立的外部顯示器總會撤銷鏡像。是以,即使使用者啟用了鏡像,當應用程式開始寫到并建立外部顯示器,它将具有優先級。

1.13.2 擷取螢幕分辨率

每個螢幕都提供了一個availablemodes屬性。這是一個分辨率對象的數組,其中的元素按從最低分辨率到最高分辨率排序。每種模式都有一個size屬性,訓示一個目标像素大小的分辨率。許多螢幕都支援多種模式。例如,vga顯示器可能具有多達6種模式,或者具有比它提供的更多不同的分辨率。支援的分辨率數量因硬體而異。總是至少有一種分辨率可用,但是當具有多種分辨率時,應該給使用者提供選擇的機會。

1.13.3 設定video out

在從[uiscreens screens]數組中擷取了外部螢幕對象之後,可以查詢可用的模式并選擇要使用的尺寸。一般說來,可以放棄選擇清單中的最後一種模式,總是使用盡可能高的分辨率,或者放棄使用最低分辨率的第一種模式。

要開始一個video out(視訊輸出)流,可以建立一個新的uiwindow,并将其尺寸調整為所選的模式。給那個視窗添加一個新視圖,以便在其上繪圖。然後把視窗配置設定給外部螢幕,并使之成為關鍵的和可見的視窗。這指令視窗顯示出來,并準備好使用它。之後,再次使原始視窗成為關鍵視窗。這允許使用者繼續與主螢幕互動。不要跳過這一步。對于最終使用者來說,什麼也不會比發現他們昂貴的裝置不再響應他們的觸摸更令他們暴躁:

1.13.4 添加顯示器連結

顯示器連結是一種計時器,以便把繪圖與顯示器的重新整理率進行同步。可以通過更改顯示器連結的frameinterval屬性,來調整這個畫面重新整理時間。該屬性預設為1,更高的數字會降低重新整理率。如果把它設定為2,則會把畫面重新整理率減半。當螢幕連接配接到裝置時,就會建立顯示器連結。uiscreen類實作了一個方法,用于傳回它的螢幕的顯示器連結對象。可以為顯示器連結指定一個目标以及要調用的選擇器。

顯示器連結定期觸發,以讓你知道何時更新video out螢幕。如果cpu負載較小,可以把時間間隔調長一些,但是這将會獲得較低的畫面重新整理率。這是一個重要的折衷,尤其是對于在裝置端需要具有進階cpu響應的直接操作界面更是如此。 秘訣1-8中的代碼為運作循環使用了常見的模式,提供最少的等待時間。在處理顯示器連結時,如果使之無效(invalidate),就将它從運作循環中删除。

1.13.5 過掃描補償

uiscreen類允許通過給overscancompensation屬性指派,補償顯示器螢幕邊緣的像素損失。在apple的文檔中描述了可以指派的技術,但是它們基本上相當于你是想剪輯内容還是想用空格填充它。

1.13.6 videokit

秘訣1-8介紹了videokit,它是一個基本的外部螢幕客戶。該秘訣示範了配置和使用有線與無線外部螢幕所需的所有特性。通過調用startupwithdelegate:來建立螢幕監測。把主視圖控制器傳遞給它,該控制器的職責将是建立外部内容。

内部的init方法開始偵聽螢幕連接配接和分離事件,并根據需要建構和删除視窗。每次顯示器連結觸發時,都會調用一個非正式的委托方法(updateexternalview:)。它将傳遞外部視窗上的視圖,委托可以根據需要在該視窗上繪圖。

在這個秘訣的配套示例代碼中,視圖控制器委托存儲一個本地顔色值,并使用它給外部顯示器着色:

每次按下動作按鈕時,視圖控制器都會生成一種新顔色。當videokit查詢控制器以更新外部視圖時,将把該顔色設定為背景色。可以看到外部螢幕即時更新為新的随機顔色。

reflector app(單一許可的費用是15美元,5台計算機的許可費用是50美元,reflectorapp.com)為airplay提供了一個優秀的調試夥伴,它提供了一種可以在mac和windows計算機上工作的無線/無apple tv的解決方案。它模拟apple tv airplay接收器,允許從ios直接廣播到桌面,并記錄該輸出。

秘訣1-8 videokit

繼續閱讀