前言
本篇屬個人階段總結,純代碼,無xib梆靖,無sb,老少皆不宜笔诵。
關于作者: 周輝
All rights reserved.
本篇內容:
-
UINavigationController
的使用 -
UITabBarController
的使用 -
UINavigationController
和UITabBarController
的綜合使用 -
UITabBar
,UINavigationBar
介紹 -
UINavigationItem
,UIBarItem
,UIBarButtonItem
,UITabBarItem
介紹 - 導航欄標題返吻,背景,顏色乎婿,返回按鈕等的自定義
繼承關系
// controller類
UIViewController : UIResponder
UINavigationController : UIViewController
UITabBarController : UIViewController
// bar類
UINavigationBar : UIView
UITabBar : UIView
// item類
UINavigationItem : NSObject
UIBarItem : NSObject
UITabBarItem : UIBarItem
UIBarButtonItem : UIBarItem
常用屬性結構
UINavigationController 的使用
參見這篇文章
UITabBarController 的使用
參見這篇文章
綜合使用
大多數(shù)的App都是對Cocoa中的UINavigationController
和UITabBarController
結合使用的测僵。下面就來看看兩種結合方式:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *firstViewController = [[UIViewController alloc] init];
UIViewController *secondViewController = [[UIViewController alloc] init];
UIViewController *thirdViewController = [[UIViewController alloc] init];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = @[firstViewController, secondViewController, thirdViewController];
UINavigationController *navigationController = [[UINavigationControlle alloc] initWithRootViewController:tabBarController];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
return YES;
} // 1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *firstViewController = [[UIViewController alloc] init];
UIViewController *secondViewController = [[UIViewController alloc] init];
UIViewController *thirdViewController = [[UIViewController alloc] init];
UINavigationController *firstNavigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
UINavigationController *secondNavigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
UINavigationController *thirdNavigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
NSArray* controllers = [NSArray arrayWithObjects:firstNavigationController, secondNavigationController, thirdNavigationController, nil];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = controllers;
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
return YES;
} // 2
方法1顯然比方法2簡單許多,我們必須需要初始化5個navigation controllers來服務5個view controllers嗎谢翎?
是的捍靠,為什么呢?
- 有些情況下在
navigationController
里用self
點語法時候森逮,會得到null
, 因為5個viewController都被pushed on the stack 榨婆。 - 當你修改了
navigationBar
,切換到其他頁面吊宋,你會發(fā)現(xiàn)其他頁面的navigationBar
也被修改了纲辽,因為只有一個navigationController
,一個navigationBar
璃搜。 - 當你從
tabBarController
的某一個viewController
里push進另一個viewController
拖吼,tab bar 會消失,因為tabBarController
不是rootViewController
, 它僅僅是在 stack 中这吻。
關于 bar 和 item
導航欄標題吊档,背景,顏色唾糯,返回按鈕等的自定義
- 原點坐標
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
nvc.navigationBar.translucent = NO;
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
nvc.navigationBar.translucent = YES;
- 如果想把畫面B返回按鈕的文字去掉在怠硼,需要在畫面A的
pushViewController
之前調用
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStyleDone
target:nil
action:nil];
self.navigationItem.backBarButtonItem = barButtonItem;
注意一定要在 pushViewController
之前,在viewDidLoad
中會crash移怯,至于為什么我也不知道香璃。
-
更改導航欄背景和文字顏色
- 方法1
//set NavigationBar 背景顏色&title 顏色
[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:20/255.0 green:155/255.0 blue:213/255.0 alpha:1.0]];
[self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]];
藍色背景,白色title舟误。NavigationBar
極其push過去的子頁面也會是修改后的背景顏色葡秒。
- 方法2
// 設置NavigationBar背景顏色
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
// @{}代表Dictionary
[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
- 導航欄使用背景圖片
如果應用程序使用了自定義圖像作為欄的背景,需要提供一個“更大”的圖片,使其延伸了狀態(tài)欄的后面眯牧。導航欄的高度現(xiàn)在是從44點(88像素)更改為64點(128像素)蹋岩。仍然可以使用了setBackgroundImage:
方法來指定自定義圖像的導航欄:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg.png"] forBarMetrics:UIBarMetricsDefault];
- 改變導航欄標題的字體
我們可以通過使用導航欄的“titleTextAttributes”屬性來自定義的文本樣式⊙伲可以指定字體剪个,文字顏色,文字陰影顏色版确,文字陰影在文本標題偏移屬性字典扣囊,使用下面的文本屬性鍵:
UITextAttributeFont
- 字體
UITextAttributeTextColor
- 文字顏色
UITextAttributeTextShadowColor
- 文字陰影顏色
UITextAttributeTextShadowOffset
- 偏移用于文本陰影
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,
shadow, NSShadowAttributeName,
[UIFont fontWithName:@"HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil nil]];
- 使用圖片作為導航欄標題
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"appcoda-logo.png"]];
- 添加多個欄按鈕項目
UIBarButtonItem *shareItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action: nil nil];
UIBarButtonItem *cameraItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action: nil nil];
NSArray *itemsArr = @[shareItem,cameraItem];
self.navigationItem.rightBarButtonItems = itemsArr;
- 自定義后退按鈕的文字和顏色
通常情況下,我們使用UINavigationController
時阀坏,push到的子頁面如暖,左上角會是系統(tǒng)自動取值上一層父頁面的title名稱,默認情況是這樣忌堂。我們有多種方法改變之。 - 方法
通過設置navigationItem的backBarButtonItem可以直接更換文字酗洒,【注意士修,要在父視圖的Controller中設置】如下:
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = item;
所有的子界面返回時都變成了我們定義的文字,如果不想顯示文字樱衷,直接""棋嘲,就會單獨顯示一個系統(tǒng)的返回箭頭圖標,也是很清晰的感覺矩桂。
- 自定義其顏色
在iOS7沸移,可以改變tintColor屬性,它提供了一個快速和簡單的方式侄榴,下面是一個示例代碼片段:
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
- 另外一種實現(xiàn)自定義導航控制器返回按鈕:
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor redColor],NSFontAttributeName:[UIFont systemFontOfSize:19.0]}];
self.title=[NSString stringWithFormat:@"第%lu頁",(unsigned long)self.navigationController.viewControllers.count];
//自定義返回按鈕
UIImage *backButtonImage = [[UIImage imageNamed:@"fanhui.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 30, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
//將返回按鈕的文字position設置不在屏幕上顯示
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
注意 title
只要設置 self.title
,那么self.navigationItem.title
和self.tabBarItem.title
值不管設置與否都和self.title
一致雹锣。
self.title
要在- (id)init:
里寫,否則在tabBar里不加載的幾個bar不顯示title癞蚕。