iOS --統(tǒng)一導(dǎo)航欄“返回”鍵,并當(dāng)push隱藏控制器底部tabBar

1蒲跨、返回按鈕:選擇按鈕

  • 設(shè)置不同狀態(tài)下,文字顏色與圖片
  • 監(jiān)聽點(diǎn)擊事件:讓其返回到上一個(gè)控制器
  • 設(shè)置內(nèi)邊距方式,即可使其調(diào)整按鈕靠近屏幕


    Snip20150901_48.png

    Snip20150901_50.png

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è)置一次安脚骸)惦界,所以,我們最終選擇第一種方案咙冗。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沾歪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乞娄,更是在濱河造成了極大的恐慌瞬逊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仪或,死亡現(xiàn)場(chǎng)離奇詭異确镊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)范删,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蕾域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人到旦,你說我怎么就攤上這事旨巷。” “怎么了添忘?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵采呐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我搁骑,道長(zhǎng)斧吐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任仲器,我火速辦了婚禮煤率,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乏冀。我一直安慰自己蝶糯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布辆沦。 她就那樣靜靜地躺著昼捍,像睡著了一般识虚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上端三,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天舷礼,我揣著相機(jī)與錄音,去河邊找鬼郊闯。 笑死妻献,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的团赁。 我是一名探鬼主播育拨,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼欢摄!你這毒婦竟也來了熬丧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤怀挠,失蹤者是張志新(化名)和其女友劉穎析蝴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绿淋,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闷畸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吞滞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佑菩。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖裁赠,靈堂內(nèi)的尸體忽然破棺而出殿漠,到底是詐尸還是另有隱情,我是刑警寧澤佩捞,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布绞幌,位于F島的核電站,受9級(jí)特大地震影響一忱,放射性物質(zhì)發(fā)生泄漏莲蜘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一掀潮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琼富,春花似錦仪吧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽择诈。三九已至,卻和暖如春出皇,著一層夾襖步出監(jiān)牢的瞬間羞芍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工郊艘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荷科,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓纱注,卻偏偏與公主長(zhǎng)得像畏浆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狞贱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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