狀態(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)題還望指出妖泄。