<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hig on Tarragon</title><link>https://tarrragon.github.io/blog/tags/hig/</link><description>Recent content in Hig on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/hig/index.xml" rel="self" type="application/rss+xml"/><item><title>iOS HIG vs Material Design 導航差異</title><link>https://tarrragon.github.io/blog/ux-design/05-navigation-patterns/ios-vs-material-navigation/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ux-design/05-navigation-patterns/ios-vs-material-navigation/</guid><description>&lt;p>iOS Human Interface Guidelines（HIG）和 Material Design 對導航行為有不同的慣例。跨平台 app（Flutter、React Native）需要決定：完全遵循一套、各平台遵循各自的慣例、或混合使用。這個決策影響使用者在不同平台上的操作體驗。&lt;/p>
&lt;h2 id="back-行為">Back 行為&lt;/h2>
&lt;h3 id="ios">iOS&lt;/h3>
&lt;p>iOS 沒有系統級的 back 按鈕。導航列左上角的 back 按鈕由 app 提供（&lt;code>UINavigationController&lt;/code> 自動加入）。使用者也可以從螢幕左邊緣向右滑動觸發 back（edge swipe gesture）。&lt;/p>
&lt;p>iOS 的 back 行為是 pop — 彈出堆疊頂端，回到前一個畫面。沒有 Android 的系統 back 按鈕覆寫機制。&lt;/p>
&lt;h3 id="android--material-design">Android / Material Design&lt;/h3>
&lt;p>Android 有系統級的 back 按鈕（虛擬或實體）。Material Design 在 app bar 左上角也放 back 箭頭或 hamburger menu 圖示。&lt;/p>
&lt;p>Android 的 back 行為由 app 控制（&lt;code>onBackPressed&lt;/code>），可以被覆寫。常見的覆寫場景：在首頁按 back 詢問「是否離開 app」、在表單中按 back 詢問「是否放棄編輯」。&lt;/p>
&lt;h3 id="跨平台決策">跨平台決策&lt;/h3>
&lt;p>Flutter 預設在 Android 上攔截系統 back 按鈕，在 iOS 上提供 back 按鈕和 edge swipe。GoRouter 的 &lt;code>pop()&lt;/code> 在兩個平台上行為一致。&lt;/p>
&lt;p>跨平台 app 需要注意的差異：iOS 使用者習慣 edge swipe back，Android 使用者習慣按系統 back 按鈕。兩者都要支援。&lt;/p>
&lt;h2 id="tab-bar-位置">Tab bar 位置&lt;/h2>
&lt;h3 id="ios-1">iOS&lt;/h3>
&lt;p>Tab bar 固定在畫面底部。iOS 使用者期望 tab bar 永遠可見、永遠在底部。Apple 的 HIG 明確建議 tab bar 在底部。&lt;/p>
&lt;h3 id="material-design">Material Design&lt;/h3>
&lt;p>Material Design 的 bottom navigation 也在底部，但額外支援 top tabs（在 app bar 下方的可滑動標籤列）。Top tabs 適合同一類內容的不同視角（全部 / 未讀 / 已標記）。&lt;/p>
&lt;h3 id="跨平台決策-1">跨平台決策&lt;/h3>
&lt;p>底部 tab bar 在兩個平台上都是標準做法。Top tabs 在 iOS 上較少見（iOS 偏好用 segmented control 代替 top tabs）。跨平台 app 用底部 tab bar 是最安全的選擇。&lt;/p>
&lt;h2 id="modal-呈現">Modal 呈現&lt;/h2>
&lt;h3 id="ios-2">iOS&lt;/h3>
&lt;p>iOS 的 modal 畫面從底部滑上來，覆蓋前一個畫面但不完全遮擋（iOS 13+ 的 sheet 呈現樣式可以看到前一個畫面的上緣）。Dismiss 操作是向下滑動或點擊關閉按鈕。&lt;/p>
&lt;h3 id="material-design-1">Material Design&lt;/h3>
&lt;p>Material Design 的 bottom sheet 和 dialog 是 modal 的主要形式。Full-screen dialog 從底部滑上來，有 close 按鈕在左上角和 action 按鈕在右上角。&lt;/p>
&lt;h3 id="跨平台決策-2">跨平台決策&lt;/h3>
&lt;p>Flutter 的 &lt;code>showModalBottomSheet&lt;/code> 和 &lt;code>showDialog&lt;/code> 在兩個平台上都可用。視覺呈現可以用 platform-adaptive widget（&lt;code>CupertinoPageRoute&lt;/code> vs &lt;code>MaterialPageRoute&lt;/code>）按平台切換。&lt;/p>
&lt;h2 id="選擇策略">選擇策略&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>策略&lt;/th>
 &lt;th>適合場景&lt;/th>
 &lt;th>代價&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>統一用 Material Design&lt;/td>
 &lt;td>以 Android 為主的 app、快速開發&lt;/td>
 &lt;td>iOS 使用者體驗不原生&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>統一用 iOS HIG&lt;/td>
 &lt;td>以 iOS 為主的 app&lt;/td>
 &lt;td>Android 使用者體驗不原生&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>各平台遵循各自慣例&lt;/td>
 &lt;td>重視兩個平台原生體驗&lt;/td>
 &lt;td>開發和測試成本翻倍&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>共用核心、差異點適配&lt;/td>
 &lt;td>多數跨平台 app 的實際選擇&lt;/td>
 &lt;td>需要判斷哪些差異值得適配&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>多數跨平台 app 選擇「共用核心、差異點適配」— 底部 tab bar、push/pop 導航在兩個平台上一致；back 手勢、modal 呈現按平台適配。&lt;/p></description><content:encoded><![CDATA[<p>iOS Human Interface Guidelines（HIG）和 Material Design 對導航行為有不同的慣例。跨平台 app（Flutter、React Native）需要決定：完全遵循一套、各平台遵循各自的慣例、或混合使用。這個決策影響使用者在不同平台上的操作體驗。</p>
<h2 id="back-行為">Back 行為</h2>
<h3 id="ios">iOS</h3>
<p>iOS 沒有系統級的 back 按鈕。導航列左上角的 back 按鈕由 app 提供（<code>UINavigationController</code> 自動加入）。使用者也可以從螢幕左邊緣向右滑動觸發 back（edge swipe gesture）。</p>
<p>iOS 的 back 行為是 pop — 彈出堆疊頂端，回到前一個畫面。沒有 Android 的系統 back 按鈕覆寫機制。</p>
<h3 id="android--material-design">Android / Material Design</h3>
<p>Android 有系統級的 back 按鈕（虛擬或實體）。Material Design 在 app bar 左上角也放 back 箭頭或 hamburger menu 圖示。</p>
<p>Android 的 back 行為由 app 控制（<code>onBackPressed</code>），可以被覆寫。常見的覆寫場景：在首頁按 back 詢問「是否離開 app」、在表單中按 back 詢問「是否放棄編輯」。</p>
<h3 id="跨平台決策">跨平台決策</h3>
<p>Flutter 預設在 Android 上攔截系統 back 按鈕，在 iOS 上提供 back 按鈕和 edge swipe。GoRouter 的 <code>pop()</code> 在兩個平台上行為一致。</p>
<p>跨平台 app 需要注意的差異：iOS 使用者習慣 edge swipe back，Android 使用者習慣按系統 back 按鈕。兩者都要支援。</p>
<h2 id="tab-bar-位置">Tab bar 位置</h2>
<h3 id="ios-1">iOS</h3>
<p>Tab bar 固定在畫面底部。iOS 使用者期望 tab bar 永遠可見、永遠在底部。Apple 的 HIG 明確建議 tab bar 在底部。</p>
<h3 id="material-design">Material Design</h3>
<p>Material Design 的 bottom navigation 也在底部，但額外支援 top tabs（在 app bar 下方的可滑動標籤列）。Top tabs 適合同一類內容的不同視角（全部 / 未讀 / 已標記）。</p>
<h3 id="跨平台決策-1">跨平台決策</h3>
<p>底部 tab bar 在兩個平台上都是標準做法。Top tabs 在 iOS 上較少見（iOS 偏好用 segmented control 代替 top tabs）。跨平台 app 用底部 tab bar 是最安全的選擇。</p>
<h2 id="modal-呈現">Modal 呈現</h2>
<h3 id="ios-2">iOS</h3>
<p>iOS 的 modal 畫面從底部滑上來，覆蓋前一個畫面但不完全遮擋（iOS 13+ 的 sheet 呈現樣式可以看到前一個畫面的上緣）。Dismiss 操作是向下滑動或點擊關閉按鈕。</p>
<h3 id="material-design-1">Material Design</h3>
<p>Material Design 的 bottom sheet 和 dialog 是 modal 的主要形式。Full-screen dialog 從底部滑上來，有 close 按鈕在左上角和 action 按鈕在右上角。</p>
<h3 id="跨平台決策-2">跨平台決策</h3>
<p>Flutter 的 <code>showModalBottomSheet</code> 和 <code>showDialog</code> 在兩個平台上都可用。視覺呈現可以用 platform-adaptive widget（<code>CupertinoPageRoute</code> vs <code>MaterialPageRoute</code>）按平台切換。</p>
<h2 id="選擇策略">選擇策略</h2>
<table>
  <thead>
      <tr>
          <th>策略</th>
          <th>適合場景</th>
          <th>代價</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>統一用 Material Design</td>
          <td>以 Android 為主的 app、快速開發</td>
          <td>iOS 使用者體驗不原生</td>
      </tr>
      <tr>
          <td>統一用 iOS HIG</td>
          <td>以 iOS 為主的 app</td>
          <td>Android 使用者體驗不原生</td>
      </tr>
      <tr>
          <td>各平台遵循各自慣例</td>
          <td>重視兩個平台原生體驗</td>
          <td>開發和測試成本翻倍</td>
      </tr>
      <tr>
          <td>共用核心、差異點適配</td>
          <td>多數跨平台 app 的實際選擇</td>
          <td>需要判斷哪些差異值得適配</td>
      </tr>
  </tbody>
</table>
<p>多數跨平台 app 選擇「共用核心、差異點適配」— 底部 tab bar、push/pop 導航在兩個平台上一致；back 手勢、modal 呈現按平台適配。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>Deep link 設計 → <a href="/blog/ux-design/05-navigation-patterns/deep-link-design/" data-link-title="Deep link 設計" data-link-desc="URL scheme / Universal Link / App Link — deep link 讓外部來源直接導航到 app 的特定畫面">Deep link 設計</a></li>
<li>go vs push 的語意差異 → <a href="/blog/ux-design/05-navigation-patterns/go-push-semantics/" data-link-title="go vs push vs pushReplacement 的 UX 語意表" data-link-desc="三種導航方法對堆疊、back 行為、使用者心理模型的影響 — 選擇依據是使用者的意圖而非技術方便">go vs push vs pushReplacement 語意表</a></li>
<li>導航模式分類 → <a href="/blog/ux-design/05-navigation-patterns/mobile-navigation-taxonomy/" data-link-title="Mobile 導航模式分類" data-link-desc="Push/pop stack / declarative router / tab bar / drawer — 四種 mobile 導航模式各自的適用場景和使用者心理模型">Mobile 導航模式分類</a></li>
</ul>
]]></content:encoded></item></channel></rss>