1蒲跨、返回按鈕:選擇按鈕
- 設(shè)置不同狀態(tài)下,文字顏色與圖片
- 監(jiān)聽點(diǎn)擊事件:讓其返回到上一個(gè)控制器
-
設(shè)置內(nèi)邊距方式,即可使其調(diào)整按鈕靠近屏幕
2、如何統(tǒng)一設(shè)置導(dǎo)航欄返回按鈕甚负,替換掉系統(tǒng)的呢?
- 問題分析:前提:要拿到導(dǎo)航控制器的所有子控制器审残,就可以統(tǒng)一返回鍵了
- 如何拿到所有的導(dǎo)航控制器的子控制器呢梭域?
3、如何拿到導(dǎo)航控制器的所有子控制器搅轿?
-
方案一:使用繼承實(shí)現(xiàn)(不可取碰辅,因?yàn)橄旅嬗懈玫姆绞剑?/p>
- 我們可以添加一個(gè)父類,在父類控制器的viewDidLoad方法設(shè)置導(dǎo)航欄的左邊的leftBarButtonItem為自定義的按鈕“返回”介时,成為父類的子類控制器即可擁有同種“返回”按鈕效果没宾。
- 但是凌彬,
推薦用自定義導(dǎo)航控制器,而不使用繼承
循衰,因?yàn)槔^承要寫很多類铲敛,復(fù)雜,且不易擴(kuò)展会钝。因?yàn)榧偃缡褂美^承伐蒋,那么我們必須明確父類控制器的控制器類型,假如設(shè)置父類控制器繼承UIVIewcontroller迁酸,那么所有的子類也都是UIViewController特性了先鱼,假如我們想擁有tableViewController特性呢?所有就麻煩了奸鬓,不易擴(kuò)展焙畔。
-
方案二:
自定義導(dǎo)航控制器,重寫push方法
-
自定義導(dǎo)航控制器
串远,重寫
導(dǎo)航控制器的push方法
宏多,除了導(dǎo)航的第一個(gè)控制器(根控制器)以外(判斷:如果當(dāng)前導(dǎo)航VC的子控制器的count 大于 0)
- 設(shè)置返回按鈕
- 監(jiān)聽返回按鈕讓其調(diào)用系統(tǒng)的pop方法即可。
- 設(shè)置隱藏push的子控制器的底部tabBar澡罚,設(shè)置
// 隱藏tabbar viewController.hidesBottomBarWhenPushed = YES;
-
#### 4伸但、代碼實(shí)現(xiàn)
+ 重寫自定義導(dǎo)航控制器的push方法
```objc
/**
* 可以在這個(gè)方法中攔截所有push進(jìn)來的控制器
*/
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.childViewControllers.count > 0) { // 如果push進(jìn)來的不是第一個(gè)控制器
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"返回" forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
button.size = CGSizeMake(70, 30);
// 讓按鈕內(nèi)部的所有內(nèi)容左對(duì)齊
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
// [button sizeToFit];
// 讓按鈕的內(nèi)容往左邊偏移10
button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button addTarget:self action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside];
// 修改導(dǎo)航欄左邊的item
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
// 隱藏tabbar
viewController.hidesBottomBarWhenPushed = YES;
}
// 這句super的push要放在后面, 讓viewController可以覆蓋上面設(shè)置的leftBarButtonItem
// 意思是,我們?nèi)稳豢梢灾匦略趐ush控制器的viewDidLoad方法中設(shè)置導(dǎo)航欄的leftBarButtonItem留搔,如果設(shè)置了就會(huì)覆蓋在push方法中設(shè)置的“返回”按鈕更胖,因?yàn)?[super push....]會(huì)加載push的控制器執(zhí)行viewDidLoad方法。
[super pushViewController:viewController animated:animated];
}
5隔显、設(shè)置導(dǎo)航控制器的子控制器的View的通用背景
你可能想函喉,同上,我們拿到導(dǎo)航控制器的所有子控制器荣月,不就可以統(tǒng)一設(shè)置背景了嗎,大錯(cuò)特錯(cuò)梳毙。
-
方案一(可行):
- 直接在指定的控制器的viewDidLoad方法設(shè)置背景顏色即可哺窄。而且只會(huì)調(diào)用一次,將背景顏色的設(shè)置交給控制器本身账锹。如果你想讓20個(gè)控制器的背景萌业,那么你在這20個(gè)控制器viewDidLoad方法設(shè)置該控制器的背景顏色即可。
-
方案二(不可燃榧怼):
- 因?yàn)榭刂破鞯膙iew是懶加載的生年,控制器的viewDidLoad:方法只會(huì)調(diào)用一次
- 具體原因分析:
- 這種方式不推薦,因?yàn)榭刂破鞯腣iew是懶加載的廓奕,你設(shè)置View就會(huì)調(diào)用viewDidLoad:方法抱婉,如果你在push方法拿到控制器的view設(shè)置其顏色為灰色的話(會(huì)調(diào)用控制器的viewDidLoad)档叔,這樣你又在(push出)該控制器的viewDidLoad方法中又設(shè)置View的背景顏色為紅色,紅色會(huì)無效蒸绩,因?yàn)榭刂破鞯膙iewDidLoad方法只會(huì)調(diào)用一次衙四。push方法中已調(diào)用設(shè)置其為灰色,但是如果你任然想重新設(shè)置讓顏色生效患亿,你想從新設(shè)置控制器的view传蹈,你只能在控制器的viewWillAppear方法中:設(shè)置控制器的背景顏色了=》背景顏色會(huì)生效,但是viewWillAppear方法又會(huì)多次調(diào)用(但是背景顏色只需設(shè)置一次安脚骸)惦界,所以,我們最終選擇第一種方案咙冗。