自定義NavigationCotroller

[iOS]自定義NavigationController的一般過(guò)程

在項(xiàng)目中蛇受,我們經(jīng)常會(huì)使用UINavigationController來(lái)管理一組控制器,但是,如果我們使用系統(tǒng)自帶的NavigationController盏浇,可能會(huì)造成許多意想不到的問(wèn)題,比如說(shuō)返回手勢(shì)的失效芽狗,NavigationBar顏色設(shè)置的不一致(由于透明度造成)缠捌,或者是當(dāng)NavigationController嵌套在UITabbarController中使用時(shí),在push過(guò)程中译蒂,tabor何時(shí)消失的不確定等等問(wèn)題,所以我們經(jīng)常使用自定義的NavigationController來(lái)控制一組控制器谊却,過(guò)程如下:

1.繼承UINavigationController來(lái)實(shí)現(xiàn)自己的NavigationController柔昼。
2.解決返回手勢(shì)失敗的問(wèn)題。
3.解決NavigationBar顏色設(shè)置不一致的問(wèn)題炎辨。
4.解決push時(shí)隱藏Tabbar捕透。
5.設(shè)置整個(gè)NavigationController狀態(tài)欄的樣式,注意:在iOS7之后碴萧,修改狀態(tài)欄樣式的方法不被提供了乙嘀,而是改為了控制器自己重寫(xiě)方法

  • (UIStatusBarStyle
    )preferredStatusBarStyle;來(lái)實(shí)現(xiàn)。但是如果控制器被NavigationController所管理破喻,那么該方法只會(huì)調(diào)用一次虎谢,即調(diào)用棧底層的控制器的該方法,其他控制器的該方法會(huì)被截?cái)唷?/li>

首先先說(shuō)第一點(diǎn)曹质,這一個(gè)很簡(jiǎn)單婴噩,直接創(chuàng)建一個(gè)繼承自UINavigationController的控制器即可,例如我的MDMNavigationController羽德。代碼如下:.h文件

</pre><p style="margin-top: 0px; margin-bottom: 22px; padding-top: 0px; padding-bottom: 0px; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Simsun; font-size: 17px;"></p><p style="margin-top: 0px; margin-bottom: 22px; padding-top: 0px; padding-bottom: 0px; color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Simsun; font-size: 17px;">第二點(diǎn):解決返回手勢(shì)失效的問(wèn)題我們可以定義一個(gè)屬性來(lái)保存NavigationController的interactivePopGestureRecognizer的delegate來(lái)解決該問(wèn)題几莽,代碼如下:</p><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; color: rgb(51, 51, 51); font-size: 17px;"><code></code>  
@interface  
MDMNavigationController ()<<span se-mark="1">UINavigationControllerDelegate>@property (nonatomic, weak) idPopDelegate;@end@implementation MDMNavigationController- (void)viewDidLoad { [super viewDidLoad]; self.PopDelegate =self.interactivePopGestureRecognizer.delegate; self.delegate = self; } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (viewController == self.viewControllers[0]) {self.interactivePopGestureRecognizer.delegate = self.PopDelegate; }else{self.interactivePopGestureRecognizer.delegate = nil; } }@end  

第三點(diǎn):解決NavigationBar顏色設(shè)置不一致的問(wèn)題,該問(wèn)題主要是因?yàn)镹avigationBar有透明度導(dǎo)致的宅静,下面代碼的方法比較實(shí)用:

@implementation  
UINavigationBar (BackgroundColor)static char overlayKey; - (UIView *)overlay { return objc_getAssociatedObject(self, &overlayKey); } - (void)setOverlay:(UIView*)overlay{ objc_setAssociatedObject(self, &overlayKey, overlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (void)lt_setBackgroundColor:(UIColor *)backgroundColor { if (!self.overlay) { [self setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; [self setShadowImage:[[UIImage alloc] init]]; self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, -20, [UIScreen mainScreen].bounds.size.width, 64)];self.overlay.userInteractionEnabled = NO; [self insertSubview:self.overlayatIndex:0]; } self.overlay.backgroundColor = backgroundColor; }
@end  

然后在合適位置設(shè)置顏色即可:

- (void  
)viewDidLoad { [super viewDidLoad]; self.PopDelegate =self.interactivePopGestureRecognizer.delegate; self.delegate = self; [self.navigationB

第四點(diǎn):解決push時(shí)隱藏Tabbar章蚣,這個(gè)就比較簡(jiǎn)單了,代碼如下:

- (void  
)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { if (self.viewControllers.count > 0) { viewController.hidesBottomBarWhenPushed = YES; } [superpushViewController:viewCo

第五點(diǎn):設(shè)置狀態(tài)欄樣式姨夹,代碼如下:

- (void  
)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { UIBarButtonItem *backBarButtonItem = [[UIBarButtonItemalloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:selfaction:@selector(backBarButtonItemAction)]; viewController.navigationItem.backBarButtonItem = backBarButtonItem; } - (void)backBarButtonItemAction { [self popViewControllerAnimated:YES]; }  

這樣下來(lái)纤垂,我們就完成了一個(gè)比較實(shí)用的自定義的NavigationController的設(shè)置了矾策,然后去自己的項(xiàng)目中使用吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洒忧,隨后出現(xiàn)的幾起案子蝴韭,更是在濱河造成了極大的恐慌,老刑警劉巖熙侍,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榄鉴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛉抓,警方通過(guò)查閱死者的電腦和手機(jī)庆尘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巷送,“玉大人驶忌,你說(shuō)我怎么就攤上這事⌒︴耍” “怎么了付魔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)飞蹂。 經(jīng)常有香客問(wèn)我几苍,道長(zhǎng),這世上最難降的妖魔是什么陈哑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任妻坝,我火速辦了婚禮,結(jié)果婚禮上惊窖,老公的妹妹穿的比我還像新娘刽宪。我一直安慰自己,他們只是感情好界酒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布圣拄。 她就那樣靜靜地躺著,像睡著了一般毁欣。 火紅的嫁衣襯著肌膚如雪售担。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天署辉,我揣著相機(jī)與錄音族铆,去河邊找鬼。 笑死哭尝,一個(gè)胖子當(dāng)著我的面吹牛哥攘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逝淹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耕姊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起栅葡,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茉兰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后欣簇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體规脸,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年熊咽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莫鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡横殴,死狀恐怖被因,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衫仑,我是刑警寧澤梨与,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站文狱,受9級(jí)特大地震影響粥鞋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜如贷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望到踏。 院中可真熱鬧杠袱,春花似錦、人聲如沸窝稿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伴榔。三九已至纹蝴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踪少,已是汗流浹背塘安。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留援奢,地道東北人兼犯。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親切黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砸脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容