可以任意定製導航欄背景的一個思路
在實際開發中經常遇到設計師給的視覺稿:有些頁面導航欄背景是透明的,有些頁面則是常規導航欄。
由於導航欄是所有子頁面共用的,一旦其中某個頁面單獨設定了導航欄背景,就需要負責儲存之前的狀態,在消失的時候恢復原來的狀態。
系統提供如下方法來設定完全透明的導航欄背景
UIImage *clearImage = [UIImage imageWithColor:[UIColor clearColor]]; [[UINavigationBar appearance] setBackgroundImage:clearImage forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; [UINavigationBar appearance].shadowImage = clearImage;
如果使用上面的方法來滿足視覺稿的效果,需要解決兩個問題:
- 每個頁面需要頻繁地儲存和恢復狀態
- 在頁面之間切換時需要保證導航欄的過渡效果自然
那麼,網路上做的比較好的APP,它們是採用了什麼方式來解決這兩個問題的呢?
微博
微博的個人主頁頁面導航欄是透明的,使用之前介紹的方法設定之後的就是這效果。
當滑動返回的時候,看一看它是怎麼解決導航欄過渡問題的 其實,我們看到的只是導航欄的一個快照,只是一張圖片而已,真實的導航欄已經被掉包,y 座標被設為了 -64,整個導航欄已經被移出螢幕外了。 微博是給每個子頁面都建立一個當前頁面的導航欄快照,頁面間切換的時候先隱藏原始導航欄,再顯示導航欄快照,在切換結束時再把真實的導航欄移回原位。微信
微信的收付款頁面導航欄是透明的,使用之前介紹的方法設定之後的就是這效果。
頁面切換時,導航欄的過渡效果和微博完全不一樣,這說明微信自己研究了一套方法,來看看到底是什麼 原來是做了一個假的導航欄,這個假的導航欄除了背景沒有別的多餘的東西了,真的導航欄還在,只是背景是全透明的,這樣頁面切換的時候過渡效果就比較自然。總結得出思路
微博和微信的思路都是把導航欄的背景設定控制在當前的頁面中,這樣在頁面切換時就不會受到影響,同時也解決了開頭提到的問題。 如果要在現有專案中進行全域性調整,借鑑上面分析得出的思路,一個比較好的方案就是:
- 把導航欄全域性設定為透明(在 BaseNavigationController 中設定)
- 每個頁面都要有一個「假的」導航欄(在 BaseViewController 中設定)
- 基類(BaseViewController)提供設定「假導航欄」背景的方法
有了可行的思路,程式碼就很簡單了,我已經把以上思路實踐到公司的專案中進行改造,實際效果挺不錯。