(1)navigationBar導航條能夠看作是self.navigationController導航控制器的一個屬性,能夠直接用點來表 示self.navigationController.navigationBar,固然navigationBar本身還有不少屬性,好比樣式 barStyle、背景backgroundColor、frame屬性(能夠獲取寬高這些信息),還能夠用setBackgroundImage方法設 置背景圖片,固然圖片多了可使用clipsToBounds剪裁。php
(2)但,navigationBar是否隱藏和顯示這個須要它爸也就是self.navigationController來控制,有直 接.navigationBarHidden設置爲YES/NO,也能夠用方法setNavigationBarHidden,都能實現效果。數組
(3)另外一個重要的知識是對navigationItem的設置,這個屬性和navigationController是平級的,因此直接能夠用 self.navigationItem使用。固然可用的有設置導航條標題的方法setTitle,固然你也能夠直接把文字換成一個視圖,即所謂的標題視 圖放在導航條的中間,用得方法是setTitleView,不少遊戲的導航條中間貌似是一個圖片,能夠用這個。ruby
(4)最重要的多是給navigationItem設置左右兩邊的按鈕,通常默認的在左邊有「返回」,在右邊的有「攝像頭」(如微信朋友圈)。 步驟就是建立一個UIBarButtonItem對象,而後直接把這個對象賦值給 self.navigationItem.leftBarButtonItem或者右邊的。固然也能夠一次建立不少個UIBarButtonItem組成 一個數組,而後把這個數組賦值給self.navigationItem.leftBarButtonItems,注意後面這個和前面這個相比,多了一個 「s」,有不少個。也要注意一下有多個按鈕時的排列順序。微信
(5)咱們建立的這些導航條按鈕有不少種形式,有的是由文字的,有的時圖片,有的時系統自帶的如攝像頭或者Reply這些icon,有的徹底是本身定義的視圖。咱們固然也能夠利用本身建立的導航條按鈕來覆蓋原來導航控制器產生的默認的按鈕,如「<Back」。ide
一樣,須要建立兩個視圖控制器(ViewController根視圖控制器,SecondViewController子視圖控制器),而後放在 導航控制器棧中。而且在AppDelegate.m中進行把導航控制器賦值給self.window.rootViewController。動畫
在ViewController.m中:spa
#import "ViewController.h"#import "SecondViewController.h"@interface ViewController () @end @implementation ViewController - (void)viewDidLoad { //建立一個按鈕,點擊後進入子視圖控制器,至關於進入子頁面 UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect]; btn1.frame=CGRectMake(38, 100, 300, 30); [btn1 setTitle:@"jump to secondviewcontroller" forState:UIControlStateNormal]; btn1.backgroundColor=[UIColor whiteColor]; self.view.backgroundColor=[UIColor redColor]; [btn1 addTarget:self action:@selector(jumpTo) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn1]; //設置導航條樣式 //默認的時白色半透明(有點灰的感受),UIBarStyleBlack,UIBarStyleBlackTranslucent,UIBarStyleBlackOpaque都是黑色半透明,其實它們有的時不透明有的時透明有的時半透明,但不知爲什麼無效果 self.navigationController.navigationBar.barStyle=UIBarStyleDefault; //設置導航條背景顏色,也是半透明玻璃狀的顏色效果 self.navigationController.navigationBar.backgroundColor=[UIColor orangeColor]; //能夠用self.navigationController.navigationBar.frame.size得到高寬,還有self.navigationController.navigationBar.frame.origin得到x和y //高44,寬375,若是是Retina屏幕,那麼寬和高@2x便可分別是750和88 //x是0很明顯,y是20,其中上面20就是留給狀態欄的高度 NSLog(@"%f",self.navigationController.navigationBar.frame.origin.y); //隱藏導航條,由此點擊進入其餘視圖時導航條也會被隱藏,默認是NO //如下一個直接給navigationBarHidden賦值,一個調用方法,都是同樣的,下面一個多了一個動畫選項而已 self.navigationController.navigationBarHidden=NO; [self.navigationController setNavigationBarHidden:NO animated:YES]; //給導航條增長背景圖片,其中forBarMetrics有點相似於按鈕的for state狀態,即什麼狀態下顯示 //UIBarMetricsDefault-豎屏橫屏都有,橫屏導航條變寬,則自動repeat圖片 //UIBarMetricsCompact-豎屏沒有,橫屏有,至關於以前老iOS版本里地UIBarMetricsLandscapePhone //UIBarMetricsCompactPrompt和UIBarMetricsDefaultPrompt暫時不知道用處,官方解釋是Applicable only in bars with the prompt property, such as UINavigationBar and UISearchBar,之後遇到時再細說 [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"big2.png"] forBarMetrics:UIBarMetricsDefault]; //若是圖片太大會向上擴展侵佔狀態欄的位置,在狀態欄下方顯示 //clipsToBounds就是把多餘的圖片裁剪掉 self.navigationController.navigationBar.clipsToBounds=YES; //設置導航標題 [self.navigationItem setTitle:@"主頁"]; //設置導航標題視圖,就是這一塊能夠加載任意一種視圖 //視圖的x和y無效,視圖上下左右居中顯示在標題的位置 UIView *textView1=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 50, 30)]; textView1.backgroundColor=[UIColor whiteColor]; [self.navigationItem setTitleView:textView1]; //設置導航條的左右按鈕 //先實例化建立一個UIBarButtonItem,而後把這個按鈕賦值給self.navigationItem.leftBarButtonItem便可 //初始化文字的按鈕類型有UIBarButtonItemStylePlain和UIBarButtonItemStyleDone兩種類型,區別貌似不大 UIBarButtonItem *barBtn1=[[UIBarButtonItem alloc]initWithTitle:@"左邊" style:UIBarButtonItemStylePlain target:self action:@selector(changeColor)]; self.navigationItem.leftBarButtonItem=barBtn1; //咱們還能夠在左邊和右邊加不止一個按鈕,,且能夠添加任意視圖,以右邊爲例 //添加多個其實就是rightBarButtonItems屬性,注意還有一個rightBarButtonItem,前者是賦予一個UIBarButtonItem對象數組,因此能夠顯示多個。後者被賦值一個UIBarButtonItem對象,因此只能顯示一個 //顯示順序,左邊:按數組順序從左向右;右邊:按數組順序從右向左 //能夠初始化成系統自帶的一些barButton,好比UIBarButtonSystemItemCamera是攝像機,還有Done,Reply等等,會顯示成一個icon圖標 //還能夠initWithImage初始化成圖片 //還能夠自定義,能夠是任意一個UIView UIBarButtonItem *barBtn2=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(changeColor2)]; UIBarButtonItem *barBtn3=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"logo-40@2x.png"] style:UIBarButtonItemStylePlain target:self action:@selector(changeColor3)]; UIView *view4=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 20, 20)]; view4.backgroundColor=[UIColor blackColor]; UIBarButtonItem *barBtn4=[[UIBarButtonItem alloc]initWithCustomView:view4]; NSArray *arr1=[[NSArray alloc]initWithObjects:barBtn2,barBtn3,barBtn4, nil]; self.navigationItem.rightBarButtonItems=arr1; [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.} -(void)changeColor{ self.view.backgroundColor=[UIColor purpleColor]; } -(void)changeColor2{ self.view.backgroundColor=[UIColor whiteColor]; } -(void)changeColor3{ self.view.backgroundColor=[UIColor orangeColor]; } -(void)jumpTo{ //這裏面核心的有兩個,所謂跳轉,其實就是往導航控制器棧中PUSH或者POP一個視圖控制器,這樣在最上面的視圖控制器就變了,這樣視圖也跟着變了,由於只顯示在棧頂得那個視圖控制器的視圖 //因此(1)控制所謂的跳轉,實際上是導航控制器在控制,在裏面的元素均可以經過navigationController屬性獲取到它們所在的導航控制器 //因此(2)獲取到導航控制器以後,使用Push的那個方法,往棧裏面放一個視圖控制器senCon1,這個新放入的在棧頂,就顯示它的視圖,因此用戶改變頁面跳轉了 SecondViewController *senCon1=[[SecondViewController alloc]init]; [self.navigationController pushViewController:senCon1 animated:YES]; } @end
在SecondViewControllor.m中:code
#import "SecondViewController.h" @interface SecondViewController () @end@implementation SecondViewController - (void)viewDidLoad { UILabel *label1=[[UILabel alloc]init]; label1.frame=CGRectMake(38, 80, 300, 30); label1.backgroundColor=[UIColor whiteColor]; label1.text=@"This is secondviewcontroller"; [self.view addSubview:label1]; UIButton *btn2=[UIButton buttonWithType:UIButtonTypeRoundedRect]; btn2.frame=CGRectMake(38, 120, 300, 30); [btn2 setTitle:@"backTo" forState:UIControlStateNormal]; btn2.backgroundColor=[UIColor orangeColor]; [self.view addSubview:btn2]; [btn2 addTarget:self action:@selector(backTo) forControlEvents:UIControlEventTouchUpInside]; //設置導航標題,這個時候的返回按鈕的title就是上一級的navigationItem的title文字 [self.navigationItem setTitle:@"子頁"]; //咱們也能夠在子頁中自定義一個返回按鈕覆蓋原先的"<back" UIBarButtonItem *barBtn5=[[UIBarButtonItem alloc]initWithTitle:@"回家" style:UIBarButtonItemStylePlain target:self action:@selector(backTo)]; self.navigationItem.leftBarButtonItem=barBtn5; [super viewDidLoad]; } -(void)backTo{ [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES]; } @end