底部標簽選擇欄,頂部導航欄用系統的,還是自定義?在實踐過程中,經常有這樣的糾結。
原因分析
- 標簽欄和導航欄跟一般視圖不一樣,他們屬于兩個容器控制器的一部分,是這兩個容器控制器的可見部分。
- 標簽欄和導航欄是全局的,整個應用就一個,在某處的改動很可能在其他場景出現意料之外的結果
- 標簽欄和導航欄處于最頂層,跟其他視圖不在一個層面
- 標簽欄和導航欄尺寸,布局等往往有特殊的約定。比如系統兼容,等比例放大等概念就不大合適用來描述他們
- 有些時候,往往出現在開發者看來比較奇葩的需求。比如標簽欄的圖標要動,內容區域的視圖延伸到導航欄。導航欄隨著表格的滑動淡入淡出的動效。等等不一而足。專業而負責的回答是讓提這些意見的人去看看蘋果的界面設計指導
系統的
- 目前用系統的還是占大多數,蘋果提供的系統組件已經足夠優秀
- 全局的,樣式只要設置一次就好了
- 標簽欄只要提供黑白的icon就可以了,自帶漸變效果
- 有些API的設計比較獨特,和預期相差較大,需要針對性多嘗試
- 已經能夠覆蓋日常絕大部分的需求
- 限制還是比較明顯的,那些“特殊的奇葩的”需求很難滿足
自定義的
- 對那些“特殊的奇葩的”需求能靈活應對
- API可以取個自己看著舒服的名字
- 能開發者能力相關,給出的API在其他開發者開來不一定比系統的好用
- 不通用,成果在其他地方用不上
- 用視圖模擬的話,是局部的,每個頁面都要搞一遍,比較繁瑣
- 繼承系統類自定義的話,受限制明顯,對那些“特殊的奇葩的”需求就顯得力不從心
- 有些系統的功能就比較難實現,比如左滑后退、中間的動效等等
選擇建議
- 盡量用系統的標簽欄和導航欄,功能已經非常強大,也是目前的主流選擇
- 必要的時候可以考慮集成系統的類進行一些自定義,不過只推薦一級繼承。
- 對那些“特殊的奇葩的”需求,就隱藏系統的標簽欄和導航欄,就當做一個普通的視圖來做,一般這種頁面是高度自定義的,不會太多
- 隱藏或者顯示系統的標簽欄或者導航欄,會影響其他的頁面。這里有兩種處理方式:一種是增加一個屬性記錄狀態,離開頁面之后恢復。另一種是讓受影響的頁面自行設置。這兩種方法都可以,只要大家約定好就行。