iOS 導(dǎo)航欄設(shè)置背景圖片咏尝、自定義返回按鈕压语,狀態(tài)欄顏色變換

狀態(tài)欄顏色修改

狀態(tài)欄(電池時(shí)間欄)兩個(gè)顏色啸罢,黑色或者白色,在不做任何設(shè)置的情況下胎食, 系統(tǒng)默認(rèn)是黑色狀態(tài)欄扰才。在頁(yè)面是深色的情況下,白色的狀態(tài)欄會(huì)顯得好看很多斥季,所以怎么顯示白色狀態(tài)欄呢训桶?
方法就是在對(duì)應(yīng)的控制器中重寫下面的方法:

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

如果全局設(shè)置APP狀態(tài)欄都是白色, 那就寫一個(gè)ViewController基類酣倾,在這個(gè)基類里面寫上面這個(gè)設(shè)置StatusBarStyle的方法舵揭,應(yīng)用內(nèi)的所有控制器都繼承這個(gè)基類就可以了。
這個(gè)設(shè)置了以后躁锡,你發(fā)現(xiàn)還是不起作用午绳。因?yàn)槲覀冞€要重寫另外一個(gè)方法:

- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

我們通常使用的viewController都是嵌套在UINavigationController中使用的,這個(gè)函數(shù)的返回值默認(rèn)為nil映之,在我們嵌套了UINavigationController的時(shí)候拦焚,加載狀態(tài)欄的時(shí)候首先會(huì)調(diào)用navigationController中的childViewControllerForStatusBarStyle函數(shù),因?yàn)槟J(rèn)返回nil杠输,那么接下來(lái)就會(huì)調(diào)用ViewController本身的preferredStatusBarStyle函數(shù)赎败,所以我們?cè)趘iewController中通過(guò)preferredStatusBarStyle函數(shù)設(shè)置的狀態(tài)欄樣式就不會(huì)被調(diào)用,所以也就無(wú)效了蠢甲。
所以我們自己要?jiǎng)?chuàng)建一個(gè)繼承于UINavigationcontroller的NavigationController僵刮,在這個(gè)子類中重寫childViewControllerForStatusBarStyle函數(shù),返回最上層的viewController鹦牛,那么viewController中的preferredStatusBarStyle函數(shù)就會(huì)被調(diào)用了搞糕。

如果需要在頁(yè)面動(dòng)態(tài)改變狀態(tài)欄顏色,可以加一個(gè)變量曼追,在preferredStatusBarStyle這個(gè)方法中根據(jù)變量值變化狀態(tài)欄窍仰,改變狀態(tài)欄時(shí)需調(diào)用下面這個(gè)方法,來(lái)立即更新?tīng)顟B(tài)欄:

[self setNeedsStatusBarAppearanceUpdate];

設(shè)置導(dǎo)航欄背景圖片

設(shè)置導(dǎo)航欄背景圖片礼殊,如果只有某個(gè)頁(yè)面需要驹吮,就在控制器中單獨(dú)設(shè)置,如果是整個(gè)應(yīng)用導(dǎo)航欄都是自定義的圖片晶伦,那么需要?jiǎng)?chuàng)建一個(gè)繼承自UINavigationcontroller的NavigationController碟狞,然后在NavigationController中設(shè)置背景圖片,下面的代碼示例坝辫,是在NavigationController中設(shè)置的:

- (void)viewDidLoad {
    [super viewDidLoad];
    //圖片拉伸篷就,否則在某些機(jī)型導(dǎo)航欄圖片是沒(méi)有填滿的
    UIImage *backImage = [[UIImage imageNamed:@"nav_background"] resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch];
    //設(shè)置導(dǎo)航欄背景圖片
    [self.navigationBar setBackgroundImage:backImage forBarMetrics:UIBarMetricsDefault];
    
    //設(shè)置導(dǎo)航欄標(biāo)題為白色
    [self.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
    //設(shè)置tintColor
    [self.navigationBar setTintColor:[UIColor whiteColor]];
}

自定義返回按鈕

很多時(shí)候我們都是要自定義返回按鈕的射亏,如果導(dǎo)航欄上左側(cè)按鈕近忙,始終是那一個(gè)返回按鈕竭业,就通過(guò)以下方法設(shè)置,代碼簡(jiǎn)潔及舍。不過(guò)首先要定義一個(gè)基類viewController未辆,讓所有viewController繼承于這個(gè)基類,在基類中設(shè)置:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //設(shè)置返回按鈕圖片
    self.navigationController.navigationBar.backIndicatorImage = [UIImage imageNamed:@"nav_back_icon"];
    self.navigationController.navigationBar.backIndicatorTransitionMaskImage = [UIImage imageNamed:@"nav_back_icon"];
    //設(shè)置返回按鈕的title為空锯玛,那么返回按鈕就無(wú)標(biāo)題只顯示nav_back_icon圖片
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = backItem;
    
}

不過(guò)這種方式定義返回按鈕咐柜,尷尬的就是,不知道點(diǎn)擊返回按鈕觸發(fā)了什么方法攘残,蘋果并沒(méi)有暴露系統(tǒng)返回按鈕的點(diǎn)擊方法拙友。有時(shí)候有這樣的需求,用戶在該頁(yè)面修改了一些信息歼郭,在點(diǎn)擊返回上一頁(yè)面時(shí)遗契,可能需要發(fā)送通知,通知其他頁(yè)面更新信息病曾。從網(wǎng)上找到一個(gè)方法牍蜂,可實(shí)現(xiàn)這個(gè)需求:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //點(diǎn)擊系統(tǒng)的返回按鈕/側(cè)滑返回
    if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
        //在這里執(zhí)行
    }
}

自定義返回按鈕還有另外一種實(shí)現(xiàn)方法,在基類viewController中實(shí)現(xiàn)一個(gè)自定義leftBarButtonItem來(lái)做返回按鈕:

- (void)viewDidLoad {
    [super viewDidLoad];

    //導(dǎo)航欄返回按鈕
    self.leftBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.leftBarButton setImage:[UIImage imageNamed:@"nav_back_icon"] forState:UIControlStateNormal];
    self.leftBarButton.frame = CGRectMake(0, 0, 40, 40);
    self.leftBarButton.imageEdgeInsets = UIEdgeInsetsMake(0, -18, 0, 0);
    [self.leftBarButton addTarget:self action:@selector(leftButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    
    if (self.navigationController.viewControllers.count > 1) {
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.leftBarButton];
    }
    
}

- (void)leftButtonClicked {
    [self.navigationController popViewControllerAnimated:YES];
}

可以把leftButtonClicked方法暴露在.h中泰涂,這樣點(diǎn)擊返回按鈕觸發(fā)這個(gè)方法鲫竞,可以在子viewController中重寫這個(gè)方法,實(shí)現(xiàn)點(diǎn)擊返回執(zhí)行一些操作逼蒙。
這種自定義leftBarButtonItem帶來(lái)的問(wèn)題就是从绘,側(cè)滑返回不起作用了。解決辦法就是在NavigationController中重新寫手勢(shì)代理其做,實(shí)現(xiàn)<UIGestureRecognizerDelegate>代理方法:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //手勢(shì)代理顶考,側(cè)滑返回
    self.interactivePopGestureRecognizer.delegate = self;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (self.childViewControllers.count > 1) {
        return YES;
    }
    return NO;
}

以上就是自定義返回按鈕的兩個(gè)方式,如有問(wèn)題還望指出妖泄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驹沿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹈胡,更是在濱河造成了極大的恐慌渊季,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罚渐,死亡現(xiàn)場(chǎng)離奇詭異却汉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荷并,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門合砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人源织,你說(shuō)我怎么就攤上這事翩伪∥⒉” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缘屹,是天一觀的道長(zhǎng)凛剥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)轻姿,這世上最難降的妖魔是什么犁珠? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮互亮,結(jié)果婚禮上犁享,老公的妹妹穿的比我還像新娘。我一直安慰自己豹休,他們只是感情好饼疙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著慕爬,像睡著了一般窑眯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上医窿,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天磅甩,我揣著相機(jī)與錄音,去河邊找鬼姥卢。 笑死卷要,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的独榴。 我是一名探鬼主播僧叉,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棺榔!你這毒婦竟也來(lái)了瓶堕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤症歇,失蹤者是張志新(化名)和其女友劉穎郎笆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忘晤,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宛蚓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了设塔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凄吏。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珍促,死狀恐怖桑阶,靈堂內(nèi)的尸體忽然破棺而出专钉,到底是詐尸還是另有隱情刮刑,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布盖喷,位于F島的核電站,受9級(jí)特大地震影響难咕,放射性物質(zhì)發(fā)生泄漏课梳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一余佃、第九天 我趴在偏房一處隱蔽的房頂上張望暮刃。 院中可真熱鬧,春花似錦爆土、人聲如沸椭懊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氧猬。三九已至,卻和暖如春坏瘩,著一層夾襖步出監(jiān)牢的瞬間盅抚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工倔矾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妄均,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓哪自,卻偏偏與公主長(zhǎng)得像丰包,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壤巷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353