Container Controllers 綜合

前言

本篇屬個人階段總結,純代碼,無xib梆靖,無sb,老少皆不宜笔诵。
關于作者: 周輝
All rights reserved.


本篇內容:

  • UINavigationController的使用
  • UITabBarController的使用
  • UINavigationControllerUITabBarController的綜合使用
  • 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

常用屬性結構

UIViewController.png
UINavigationController.png
UITabBarController.png
UINavigaitonBar.png
UITabBar.png
UINavigationItem.png
UIBarItem.png

UINavigationController 的使用

參見這篇文章

UITabBarController 的使用

參見這篇文章

綜合使用

大多數(shù)的App都是對Cocoa中的UINavigationControllerUITabBarController結合使用的测僵。下面就來看看兩種結合方式:

- (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嗎谢翎?

是的捍靠,為什么呢?

  1. 有些情況下在navigationController里用self點語法時候森逮,會得到null, 因為5個viewController都被pushed on the stack 榨婆。
  2. 當你修改了navigationBar,切換到其他頁面吊宋,你會發(fā)現(xiàn)其他頁面的navigationBar也被修改了纲辽,因為只有一個navigationController,一個navigationBar璃搜。
  3. 當你從tabBarController的某一個viewController里push進另一個viewController拖吼,tab bar 會消失,因為tabBarController不是rootViewController, 它僅僅是在 stack 中这吻。

關于 bar 和 item

參見我的一個小Demo

導航欄標題吊档,背景,顏色唾糯,返回按鈕等的自定義

  • 原點坐標
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
nvc.navigationBar.translucent = NO;
translucent=NO ![Uploading 屏幕快照 2015-09-28 下午12.29.07_466603.png . . .].png
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
nvc.navigationBar.translucent = YES;
translucent = YES.png
  • 如果想把畫面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.titleself.tabBarItem.title值不管設置與否都和self.title一致雹锣。

self.title要在- (id)init:里寫,否則在tabBar里不加載的幾個bar不顯示title癞蚕。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蕊爵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桦山,更是在濱河造成了極大的恐慌攒射,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恒水,死亡現(xiàn)場離奇詭異会放,居然都是意外死亡,警方通過查閱死者的電腦和手機钉凌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門咧最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事窗市∠瓤叮” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵咨察,是天一觀的道長论熙。 經(jīng)常有香客問我,道長摄狱,這世上最難降的妖魔是什么脓诡? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮媒役,結果婚禮上祝谚,老公的妹妹穿的比我還像新娘梦皮。我一直安慰自己蜓氨,他們只是感情好疲酌,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布崇堰。 她就那樣靜靜地躺著而账,像睡著了一般启摄。 火紅的嫁衣襯著肌膚如雪凌外。 梳的紋絲不亂的頭發(fā)上蹦玫,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天啊片,我揣著相機與錄音只锻,去河邊找鬼。 笑死紫谷,一個胖子當著我的面吹牛齐饮,可吹牛的內容都是我干的。 我是一名探鬼主播笤昨,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼祖驱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咬腋?” 一聲冷哼從身側響起羹膳,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎根竿,沒想到半個月后陵像,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寇壳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年醒颖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壳炎。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泞歉,死狀恐怖逼侦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情腰耙,我是刑警寧澤榛丢,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站挺庞,受9級特大地震影響晰赞,放射性物質發(fā)生泄漏。R本人自食惡果不足惜选侨,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一掖鱼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧援制,春花似錦戏挡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洪己,卻和暖如春掌栅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背码泛。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澄耍,地道東北人噪珊。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像齐莲,于是被迫代替她去往敵國和親痢站。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容