1. 程式人生 > >【IOS】自定義UINavigationController看這篇就夠了

【IOS】自定義UINavigationController看這篇就夠了

這篇文章足以應對90%的APP應用定製化的需求了.

首先我們建立一個類JDCustomNavigationController繼承UINavigationController

需要建立UINavigationController的時候只要用JDCustomNavigationController代替即可

預設導航欄應該是這個樣子的:


1.修改背景顏色:
在.m中實現如下方法

+ (void)initialize {
    //appearance方法返回一個導航欄的外觀物件
    //修改了這個外觀物件,相當於修改了整個專案中的外觀
    UINavigationBar *navigationBar = [UINavigationBar appearance];
    //設定導航欄背景顏色
    [navigationBar setBarTintColor:JDRGBColor(55,207,240,1)];
}

導航欄將會變成這樣:


2.設定導航欄標題顏色

   //設定標題欄顏色
    navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName : [UIFont systemFontOfSize:18]};
    

3.設定導航欄按鈕顏色

    //設定NavigationBarItem文字的顏色
  [navigationBar setTintColor:[UIColor whiteColor]];

導航欄就變成這個樣子了:


但是我們push其他頁面的時候導航欄是這樣個樣子的


怎麼修改返回按鈕的文字呢?

-只需要重寫下邊的方法:

//重寫push後返回按鈕的文字,文字可以為空字串.
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    //修改返回文字
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
  
    [super pushViewController:viewController animated:animated];
}```

就會變成這樣子了:

![](http://upload-images.jianshu.io/upload_images/746057-2a5206a1c1aea0a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
那如果我們連文字都不想要,想要完全的一個返回箭頭或者其他圖片怎麼辦呢?
1.你可以將上邊的返回文字改為@"",這樣雖然可以,但是返回箭頭偏左,不太美觀,如下圖:
![](http://upload-images.jianshu.io/upload_images/746057-b3a889d865dfcf1a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
那怎麼辦呢?
乾脆重寫返回按鈕
但是要注意我的寫法:
  • (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    //全部修改返回按鈕,但是會失去右滑返回的手勢
    if (viewController.navigationItem.leftBarButtonItem ==nil && self.viewControllers.count >=1) {

      viewController.navigationItem.leftBarButtonItem = [self creatBackButton];
    

    }

    [super pushViewController:viewController animated:animated];
    }

-(UIBarButtonItem *)creatBackButton
{
return [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]style:UIBarButtonItemStylePlain target:self action:@selector(popSelf)];

}
-(void)popSelf
{
[self popViewControllerAnimated:YES];
}

用的是leftBarButtonItem而不是backBarButtonItem哦,具體區別請看這裡
[leftBarButtonItem與backBarButtonItem的區別](http://www.jianshu.com/p/43dad6794db4)

if (viewController.navigationItem.leftBarButtonItem ==nil && self.viewControllers.count >=1)

這個判斷是為了最底層的viewcontroller不至於加上我們自定義的按鈕
執行之後的效果:

![](http://upload-images.jianshu.io/upload_images/746057-df5f999b089f9a4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

但是有個我們,我發現系統的右滑返回失效了,怎麼辦呢?
彆著急,只要在viewDidload中新增以下方法即可

//重寫了leftbarItem之後,需要新增如下方法才能重新啟用右滑返回
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.delegate = nil;
}

這樣足夠使用了吧.

另外附隱藏某個導航欄背景透明的方法
  • (void)viewWillAppear:(BOOL)animated
    {
    [super viewWillAppear:animated];
    //設定導航欄背景圖片為一個空的image,這樣就透明瞭
    [self.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
    //去掉透明後導航欄下邊的黑邊
    [self.navigationBar setShadowImage:[[UIImage alloc] init]];
    }

  • (void)viewWillDisappear:(BOOL)animated{

    //如果不想讓其他頁面的導航欄變為透明 需要重置
    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:nil];
    }


其他小知識點:
//設定導航欄文字的主題
 NSShadow *shadow = [[NSShadow alloc]init];
 [shadow setShadowOffset:CGSizeZero];
 [navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor],NSShadowAttributeName : shadow}];
 [navigationBar setBackgroundImage:[UIImage imageNamed:@"ic_cell_bg_selected"] forBarMetrics:UIBarMetricsDefault];
 //修改所有UIBarButtonItem的外觀
 UIBarButtonItem *barButtonItem = [UIBarButtonItem appearance];
 
 // 修改item的背景圖片
 //[barItem setBackgroundImage:[UIImage imageNamed:@"navigationbar_button_background.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
 //[barItem setBackgroundImage:[UIImage imageNamed:@"navigationbar_button_background_pushed.png"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
 //修改item上面的文字樣式
 NSDictionary *dict [email protected]{NSForegroundColorAttributeName : [UIColor whiteColor],NSShadowAttributeName : shadow};
 [barButtonItem setTitleTextAttributes:dict forState:UIControlStateNormal];
 [barButtonItem setTitleTextAttributes:dict forState:UIControlStateHighlighted];
 //修改返回按鈕樣式
 [barButtonItem setBackButtonBackgroundImage:[UIImage imageNamed:NAVIGATION_BAR_BACK_ICON_NAME] forState:UIControlStateNormal barMetrics:UIBarMetricsCompact];
 //設定狀態列樣式
 [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

Demo地址:https://github.com/yuying2012/WJDStudyLibrary
這是一個大工程,請從工程中尋找相關模組程式碼.

相關推薦

IOS定義UINavigationController

這篇文章足以應對90%的APP應用定製化的需求了. 首先我們建立一個類JDCustomNavigationController繼承UINavigationController 需要建立UINavigationController的時候只要用JDCustomNavigationCont

本人禿頂程式設計師Java執行緒池詳解,

←←←←←←←←←←←← 快!點關注!!! 構造一個執行緒池為什麼需要幾個引數?如果避免執行緒池出現OOM?Runnable和Callable的區別是什麼?本文將對這些問題一一解答,同時還將給出使用執行緒池的常見場景和程式碼片段。 基礎知識 Executors建立執行緒池 J

還不瞭解Calendar?實現定義Android日曆,

背景介紹 日曆對我的生活而言是一個容易被忽視,而又十分重要的東西。在Android中,我們也常常需要操作日曆去實現一些需求。比如根據日期獲取對應資料,或者承載了一些需求的自定義日曆。為了方便對日期的操作,誕生了Calendar 類。這大大簡化了我們的計算。 事實上,我們只需要

學習Java JDBC,

影響 數據庫中間件 project prepare 管理系 lba 分布 為我 vax JDBC (Java DB Connection)---Java數據庫連接 JDBC是一種可用於運行SQL語句的JAVA API(ApplicationProgramming

入門Webpack,

ref ebp shu 走了 pack webp body 入門 ble 原文地址:https://www.jianshu.com/p/42e11515c10f一直以前對webpack不是很了解,通過看了原文,自己動手走了一邊,算是對webpack有了個入門。我把自己做了的

Map總結,

java map 概要 學完了Map的全部內容,我們再回頭開開Map的框架圖。 第1部分 Map概括 (01) Map 是“鍵值對”映射的抽象接口。(02) AbstractMap 實現了Map中的絕大部分函數接口。它減少了“Map的實現類”的重復編碼。(03) SortedMap 有序的“鍵值對”映

高效| 工廠如何做好設備管理工作?

結構 性問題 vpd 以及 而且 追溯 隨著 綜合 等等 近年來,我國經濟增長的人口紅利優勢逐漸喪失,出現了?“民工荒”和“用工難”以及勞動力成本迅速上升的現象,並進而導致了不少工廠遷移、甚至倒閉。因此對大的制造企業而言,要想提升核心競爭力,必須從兩個方面著手:**一是通過

服務器Centos7.4 下jdk1.8環境配置、mysql環境搭建,mysql找回(重置)密碼

版本 jdk下載 改密 我們 完成 eight ati html wid 最近一直幫我的同學搭建自己的服務器,其中涉及到了以下知識點,經過查詢博客資料等方式,再加上多重實踐,我成功總結出了完整的配置一個簡單服務器環境的步驟: (來自 ZYXS 的CSDN 博客 ,全文地址請

分布式鎖

緩存 數據清理 void 多次 有一個 還需要 api 互斥 pub 什麽是鎖?在單進程的系統中,當存在多個線程可以同時改變某個變量(可變共享變量)時,就需要對變量或代碼塊做同步,使其在修改這種變量時能夠線性執行消除並發修改變量。而同步的本質是通過鎖來實現的。為了實現多個線

使用Visual Studio Code開發.NET Core

原文: 使用Visual Studio Code開發.NET Core看這篇就夠了 作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9926078.html 在本文中,我將帶著大家一步一步的通過圖文的形式來演示如何在Visual Studio Code

還不會處理時間資料?

  如何統一時間格式?   於統計來源的不同,或者記錄資料人員的錯誤,會導致日期格式各種各樣。下面表格是從我公眾號裡匯出的excel資料。   標題列是釋出文章的題目,日期列是這篇文章釋出的時間,當日漲粉量列是釋出該篇文章以後

入門 Webpack,

通過 位置 post 進行 參考 sets 想要 避免 pat 轉:https://segmentfault.com/a/1190000006178770 2018年8月25日更新,目前 webpack 已經更新值 4.17.1 ,本文所用到的各種庫或多或少有些過時,跟著代

Python Web不知道怎麼學?!

Python有很多作用,接觸過python的朋友肯定知道其幾乎無所不能,前端、後端、資料、ML\AI、自動化、爬蟲、資料分析,人工智慧等等。 第一階段:Python入門(框架再怎麼變,基本語法不會變,基礎中的基礎) ·資料型別 ·迴圈判斷 ·常用模組 ·函式、迭代器、裝飾器

Elasticsearch Query DSL 整理總結(二)—— 要搞懂 Match Query,

目錄 引言 構建示例 match operator 引數 analyzer lenient 引數 Fuzziness fuzzniess 引數 什麼是模糊搜尋? Levenshtein Edit Dist

一心多用多執行緒-執行緒池ThreadPoolExecutor-

首先先寫一下執行緒池的概念: 執行緒池:執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後自動啟動這些任務。執行緒池執行緒都是後臺執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管程式碼中空閒(如正在等待某個

.NET Core實戰專案之CMS 第二章 入門-快速入門ASP.NET Core

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/9985451.html 本來這篇只是想簡單介紹下ASP.NET Core MVC專案的(畢竟要照顧到很多新手朋友),但是轉念一想不如來點猛的(考慮到急性子的朋友),讓你通過本

Python爬蟲Scrapy入門

一、初窺scrapy   scrapy中文文件:   http://scrapy-chs.readthedocs.io/zh_CN/latest/   Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資

Redis分散式鎖的實現原理~

  一、寫在前面 現在面試,一般都會聊聊分散式系統這塊的東西。通常面試官都會從服務框架(Spring Cloud、Dubbo)聊起,一路聊到分散式事務、分散式鎖、ZooKeeper等知識。 所以咱們這篇文章就來聊聊分散式鎖這塊知識,具體的來看看Redis分散式鎖的實現原理

仿有贊後臺+vue+ts+vuecli3.0+elementUi 集合

前言 最近嘗試了vue+ts的組合個人感覺vue對於ts並沒有特別的像angular2這樣的友好,但是對於ts和js之間個人還是選擇ts的。語法糖來說es6簡直舒爽,下面我詳細介紹下怎麼使用ts+vue。ts+vue的外掛會少上很多,但是肯定會隨著vue對ts的支援外掛也會越來越多當前專案demo預覽(作為

KubeCon中國峰會首日,技術乾貨

  雲原生領域旗艦盛會KubeCon+CloudNativeCon在2018年冬天終於來到中國,11月14日,大幕開啟的KubeCon迎接了2500多名參會者,來自亞洲、北美、歐洲、澳洲等地區的科技公司和使用者代表匯聚中國上海,共襄Kubernetes引領的雲原生技術帶給世界