iPhone Duo自適應版面教學

🕒 19:262026/9/29 10:515,191 字27 張照片

本講說明如何讓 APP 適應 iPhone Duo 的鉸鏈、內外螢幕與前置攝像頭等硬體特性。核心做法是辨識保留區域,並依內容關係選擇位移模式或 Arrangement 排列模式,讓內容在展開、部分折疊與桌立等姿態下都保持可見、可用且易於操作。

本講重點

「讓咱們的APP更好地適應iPhone Duo獨特的硬體特性」
— Izzy

iPhone Duo保留區域位移模式Arrangement排列模式Reserved RegionsDivision遮擋區域Arrangement View

概念整理:硬體特性與保留區域

iPhone Duo 的硬體特性不只是裝置外觀,而是會直接影響介面可用範圍。外螢幕的攝像頭在視覺上會持續存在,並會與系統狀態欄、APP 工具欄及 Tab 欄,在新的側邊安全區中縱向排列。內螢幕則需要因應中央折疊位置,以及處於啟用狀態的前置攝像頭來調整內容。

0:14iPhone Duo 的鉸鏈與內外螢幕攝像頭會形成介面必須避開或配合的保留區域,設計前應先辨識這些硬體影響範圍。

概念整理:位移模式的判斷原則

位移模式是依可用空間變化,動態調整既有介面元素的呈現方式。目標不是單純把內容挪開,而是讓元素在裝置部分折疊後,仍位於能完成自身功能的可用區域,並持續維持可見、可用與易用。位移對象可以是單一控制項、容器,或更大範圍的版面組成。

1:28位移模式的設計起點,是先判斷 iPhone Duo 在不同姿態下哪些空間可用,再決定既有元素應如何調整。
2:09部分折疊後,原本位於螢幕中央的元素應移至仍能支援其功能的可用區域;位移對象可以是控制項、容器或一組版面元素。

相簿長按照片後出現的選單,是共同位移的例子。若折疊觸發版面調整,照片與其選單應一起移動,可由螢幕彎曲位置自然分隔;若只移動照片,照片與選單距離過遠,使用者便難以理解兩者的關係。

3:12相簿的照片與長按後選單具有直接關聯,折疊時應共同位移,而非只移動其中一方。
「如果多個空間,包括容器,它們存在一種協同的關係,那麼就讓它們共同位移,從而體現出它們的關聯性」
— Izzy

相反地,文章、文件、列表與 Feed 流等可連續捲動的內容,不會採用位移。這類內容的關鍵互動是不中斷地捲動瀏覽;若強行位移,反而會破壞連貫的捲動體驗。

概念整理:依姿態與上下文決定目標位置

Alert 等元素在部分折疊時通常會移到設備末端的一側,因為即使使用者繼續閉合設備,其位置仍能保持連貫。桌立姿態則以上半螢幕的內容可見性較好為前提,因此 Alert 會移至上方;下半螢幕較適合作為穩定的觸控表面,媒體控制等面向內容操作的元素通常移至下方。

4:01部分折疊時,Alert 通常移往設備末端一側,使裝置進一步閉合時仍能維持位置連貫性。
4:16桌立姿態中,上半螢幕較適合顯示 Alert 等需要清楚可見的內容。
4:27桌立姿態的下半螢幕可作為較穩定的觸控表面,適合配置媒體控制等互動空間。

備忘錄 App 的搜尋提供了上下文優先的範例。啟用中的搜尋框會吸附於鍵盤頂端;內螢幕完全展開時,搜尋框可利用水平空間置中顯示;部分折疊時,則改放到搜尋對象所在的那半邊螢幕,以維持搜尋行為與其結果的關聯。

4:54備忘錄的搜尋框會依折疊狀態留在搜尋對象所在的一側,優先維持搜尋操作的上下文關聯。

概念整理:Reserved Region API

SwiftUI 可透過 GeometryReader,或 onGeometryChange 修飾符中的 GeometryProxy 查詢保留區域,並使用 GeometryProxy 的 Reserved Regions 方法取得視圖可用的保留區域。UIKit 則可使用 UIView 上的 Reserved Regions 方法,並讀取保留區域的 frame,將結果納入自訂版面計算。

7:20SwiftUI 可由 GeometryReader 或 onGeometryChange 的 GeometryProxy 查詢 Reserved Regions,據以取得可用保留區域。
8:01保留區域可分為啟用與非啟用狀態;使用 Include Inactive 可在版面規劃時一併取得非啟用區域。
8:45FaceTime 攝像頭位置屬於遮擋區域,可作為局部 frame 查詢;相機活躍時,此區域會進入啟用狀態。

概念整理:系統容器與排列模式

NavigationStack、NavigationSplitView 與 TabView 提供常見的導航設計模式,協助使用者在 APP 中有效導航;List 與 Scroll View 則可作為內容容器。介於導航容器與內容容器之間,還有一類會依特定規則決定兩個視圖關係的新型版面容器,稱為 Arrangement,也就是排列模式。

9:26NavigationStack、NavigationSplitView、TabView、List 與 Scroll View 是既有系統容器;Arrangement 位於導航與內容容器之間,專責決定兩個視圖的版面關係。

羅爽以播客 APP 的 Now Playing 為例:在 iPad 點選文字稿按鈕後,文字稿會出現在另一側,形成拆分版面。iPhone Duo 即使折疊後也可採相似拆分方式;再次隱藏文字稿時,播控視圖不會如 iPad 般回到中央,而是留在折疊區域左側,讓它容易觸達且不被遮擋。

9:42播客 APP 的 Now Playing 可開啟文字稿,將播放與文字稿視圖拆分為兩側呈現。
9:57Arrangement 會根據規則決定兩個視圖的關係;在折疊後隱藏文字稿時,播控視圖仍保留在折疊區域左側。
「這個將輸入轉換為輸出的函數,被稱為排列模式」
— 羅爽

概念整理:Arrangement View 的建立與 split

SwiftUI 中,可在 NavigationStack 內加入 arrangement view。它接收 primary view 與 secondary view;語音備忘錄的範例中,player view 用於顯示正在播放的語音備忘錄,up next view 用於顯示其後即將播放的待播列表。UIKit 則使用 UIArrangementViewController,將其加入 UINavigationController 作為 root view controller,再分別指定 player view controller 與 up next view controller 為 primary 和 secondary。

10:44Arrangement View 由 primary view 與 secondary view 組成;語音備忘錄範例以 player view 搭配待播的 up next view。
10:57在 UIKit 中,UIArrangementViewController 可作為 UINavigationController 的 root view controller,並分別設定 primary 與 secondary 視圖控制器。

arrangementViewStyle 的預設值是 split。拆分排列會分配畫面區域給 primary view 與 secondary view:一般在寬度大於高度時水平拆分,例如 iPad 橫向或類似寬高比的 iPhone;旋轉後若高度大於寬度,則改為垂直排列。

12:24split 是 arrangementViewStyle 的預設樣式,會依可用視圖的寬高關係決定水平或垂直拆分。

若播放視圖只希望水平排列,可用 axis 函數指定 horizontal。當 arrangement view 無法依指定軸向排列時,只會顯示一個視圖;例如高度大於寬度、主軸為垂直,但又限定只能水平排列時,畫面只顯示 player view。UIKit 可用 updateArrangement 為 UIArrangementViewController 設定水平軸向。

12:48以 axis 指定 horizontal 後,若目前空間無法水平排列,Arrangement View 只顯示單一視圖,此例保留 player view。
13:11UIKit 可透過 updateArrangement 為 UIArrangementViewController 設定排列軸向。
13:17iPhone Duo 上的 split 排列可讓播放視圖與待播列表分別占用適合的區域。

概念整理:overlay 與樣式選擇

另一種 arrangementViewStyle 是 overlay。split 傾向將內容並排,overlay 則傾向將內容上下疊加。語音備忘錄範例將樣式改為 overlay、交換播放視圖與待播列表的位置,並為待播列表增加收攏樣式。裝置折疊時,overlay 會傾向讓兩個視圖並排,使待播列表獲得獨立展示空間。

13:39overlay 讓內容傾向上下疊加;範例將播放與待播視圖交換位置,並加入可收攏的待播列表樣式。
14:05裝置折疊時,overlay 排列傾向讓兩個視圖並排,讓待播列表取得獨立展示空間。

使用 overlay 時,可查詢環境屬性 overlayArrangementZIndex。待播列表中的此值會隨裝置折疊或展開改變,因此可用來在收攏與展開樣式之間切換。UIKit 對應作法是呼叫 UIArrangementViewController 的 state(for:) 函數,再由回傳狀態的 zIndex 屬性查詢主視圖的 z 軸索引。

14:37overlayArrangementZIndex 可反映折疊與展開造成的前後層級變化,讓待播列表切換收攏或展開樣式。
16:00使用 overlay 時可依 z 軸層級調整待播列表;樣式選擇應先判斷兩個視圖是前景與背景,或主視圖與詳情頁的關係。
16:27輔助閱讀器的前景空間與背景可讀內容具有可接受的疊加關係,因此是 overlay 的適用情境。
17:37播客播放畫面與文字稿是主視圖與詳情頁關係,兩者不應互相遮擋,更適合 split。

重要提醒

18:22Arrangement View 不應承擔導航容器功能,也不宜置於 List 或 Scroll View 等可捲動容器內;應依版面責任正確分層。
「首先審查你的App的居中佈局,考慮一下是否可以改成雙列佈局,或者是哪種位移模式最適合當前場景」
— 羅爽

課後複習

由爪爪聽寫圖文報告生成AI 生成