iOS 一種新的修改導航欄樣式的方法(支援iOS10).
iOS 一種新的修改導航欄樣式的方法.
開宗明義:
對系統導航欄最底層的UIView加一層CALayer, 通過操作這個自己建立的CALayer來修改導航欄樣式.
修改系統導航欄樣式的幾種方法
- 1.使用系統的API, 更換導航欄背景圖片
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg.png"] forBarMetrics:UIBarMetricsDefault];
//或者
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"m_nav"] forBarMetrics:UIBarMetricsDefault];
self.navigationBar.layer.masksToBounds = YES;
優點: 找UI出圖就好了.
缺點: 如果專案中導航欄樣式需要經常變化, 這樣的方式就很麻煩了.需要考慮push和pop的情況. 所以在每個控制器中viewWillAppear和viewDisAppear中都需要寫導航欄樣式的程式碼. 而且沒辦法實現類似QQ中, 滑動時導航欄顏色漸變的效果.
- 2.在導航欄中加一層UIView.
缺點: 導航欄中插入一層UIView後, 系統提供的側滑返回手勢失效. 系統的返回按鈕不可點選.
一種新的想法
第一種方法, 更換導航欄背景圖片應該是應用最多的方法. 但是在系統更新到iOS10之後. 寫了self.navigationBar.layer.masksToBounds = YES.之後會發現導航欄最上方狀態列的位置, 顏色設定失效了.
觀察發現蘋果在iOS10 的SDK中對導航控制器新增了許多新的API. 可能在增加這些API的同時, 也對導航控制器的機制做了一些修改.
我的手機更新到iOS10之後發現幾個大廠出的app導航欄也出了問題...
處理導航欄問題. 最根本的辦法還是全部自定義.但是自定義寫起來實在太過麻煩. 最好還是能在系統導航欄的基礎上做簡單修改實現我們想要的效果.
為此我想到的辦法是在系統導航欄的各個層次中找到最底層的UIView. 對這一層UIView新增一層CALayer. 首先保證導航欄中其他的UIView全部是透明的. 然後通過操作這個我們建立的CGLayer來達到控制導航欄樣式的目的.
經過我的實驗發現新增CALayer不會影響系統的返回按鈕和系統的側滑返回手勢(話說這個返回手勢做的確實很好用, 很舒服.).
步驟.
- 將導航欄的Translate屬性設定為YES.
- 在NavigationController中的ViewDidLoad方法中遍歷當前View的SubView找到陣列的"0"號元素.(iOS9的SDK中提供了拿到最底層view的API. 但是app需要支援iOS8. 不能使用這個API.)
- 建立一個CALayer.將這個CALayer新增到"0"號元素(它是一個UIView)subLayer中.
- 將導航欄中的所有的UIView設定為透明.(用文章開始的第一種方法, 設定透明圖片).
over. 以後需要設定導航欄顏色, 就對這個CALayer設定顏色即可. 還可以通過操作CALayer實現導航欄顏色漸變等效果.
程式碼.
我的專案中導航欄樣式會發生多次變化. 所以對導航欄使用上面的方法進行了一些簡單封裝.
使用方法. 初始化navigationController之後通過介面給導航欄初始的樣式. 以後如果需要修改導航欄樣式就在push之前修改樣式即可.
程式碼連結.
https://github.com/ddyd369/ZDNavigationController
轉發請註明出處(簡書 行如風).
我的理解有什麼錯漏之處還請指出謝謝
相關文章
- CARDS主題 & 導航欄樣式修改
- PbootCMS預設麵包屑導航樣式修改及自定義的設定方法boot
- IOS對於導航欄的顯示和隱藏不統一的解決方法iOS
- iOS 記一次導航欄平滑過渡的實現iOS
- 2018-08-20 iOS導航欄的那些事iOS
- 直播系統程式碼,自行更改導航欄樣式
- 一種基於園區電子地圖的導航方法,怎樣製作智慧導航園區導覽圖?地圖
- 簡易的iOS導航欄顏色漸變方案iOS
- 手機直播原始碼,突出底部導航欄中間按鈕的樣式原始碼
- 如何修改PbootCMS預設麵包屑導航樣式及自定義設定方法boot
- 修改狀態列與導航欄顏色
- React修改Antd元件樣式的方法React元件
- ANT 的Table表格樣式修改方法
- 關於iOS 狀態列、導航欄的幾處筆記iOS筆記
- 分析微信(iOS 版)定製導航欄按鈕的思路iOS
- 技術乾貨 | jsAPI 方式下的導航欄的動態化修改JSAPI
- weex沉浸式導航欄解決方案
- iOS開發:給UIWebview的導航欄新增返回、關閉按鈕iOSUIWebView
- 導航欄的隱藏問題
- iOS中的螢幕導航iOS
- 創新實訓(十)——程式碼美化部分:導航欄的active
- iOS Navigation Bar 導航欄折騰記 (Swift&OC)iOSNavigationSwift
- 可以任意定製導航欄背景的一個思路
- 小小的導航欄,有大大的秘密。
- uni-app動態修改頂部導航欄標題APP
- Flutter 導航欄AppBarFlutterAPP
- vue的scope導致樣式修改不了問題Vue
- iOS系統中導航欄的轉場解決方案與最佳實踐iOS
- qml 導航欄TabBar 工具欄ToolBartabBar
- 定製化你的ReactNative底部導航欄React
- HTML橫向導航欄HTML
- uniapp自定義導航欄APP
- GitHub 導航欄加強Github
- bootstrap導航欄學習boot
- 成品直播原始碼,頂部導航欄部分支援左右滑動原始碼
- JS寫的二級導航欄(利用冒泡原理)JS
- 純CSS的導航欄Tab切換例項CSS
- iOS系統導航欄自定義標題動畫跳變解析iOS動畫
- 導航欄點選選中