(1)navigationBar導航欄可以被看作是self.navigationController一個屬性導航控制器,它可以由點直接表示self.navigationController.navigationBar。當然navigationBar他還是很物業。讓我們風格barStyle、背景backgroundColor、frame屬性(能夠獲取寬高這些資訊)。還能夠用setBackgroundImage方法設定背景圖片。當然圖片多了能夠使用clipsToBounds剪裁。
(2)但。navigationBar是否隱藏和顯示這個須要它爸也就是self.navigationController來控制,有直接.navigationBarHidden設定為YES/NO,也能夠用方法setNavigationBarHidden,都能實現效果。
(3)還有一個重要的知識是對navigationItem的設定,這個屬性和navigationController是平級的,所以直接能夠用self.navigationItem使用。當然可用的有設定導航條標題的方法setTitle,當然你也能夠直接把文字換成一個檢視。即所謂的標題檢視放在導航條的中間,用得方法是setTitleView,非常多遊戲的導航條中間貌似是一個圖片,能夠用這個。
(4)最重要的可能是給navigationItem設定左右兩邊的button,一般預設的在左邊有“返回”。在右邊的有“攝像頭”(如微信朋友圈)。步驟就是建立一個UIBarButtonItem物件,然後直接把這個物件賦值給self.navigationItem.leftBarButtonItem或者右邊的。當然也能夠一次建立非常多個UIBarButtonItem組成一個陣列。然後把這個陣列賦值給self.navigationItem.leftBarButtonItems。注意後面這個和前面這個相比,多了一個“s”。有非常多個。也要注意一下有多個button時的排列順序。
(5)我們建立的這些導航條button有非常多種形式。有的是由文字的,有的時圖片,有的時系統自帶的如攝像頭或者Reply這些icon,有的全然是自定義的檢視。
我們當然也能夠利用自己建立的導航條button來覆蓋原來導航控制器產生的預設的button,如“<Back”。
相同。須要建立兩個檢視控制器(ViewController根檢視控制器,SecondViewController子檢視控制器),然後放在導航控制器棧中。而且在AppDelegate.m中進行把導航控制器賦值給self.window.rootViewController。
在ViewController.m中:
#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
//建立一個button,點選後進入子檢視控制器,相當於進入子頁面
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有點相似於button的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];
//設定導航條的左右button
//先例項化建立一個UIBarButtonItem,然後把這個button賦值給self.navigationItem.leftBarButtonItem就可以
//初始化文字的button型別有UIBarButtonItemStylePlain和UIBarButtonItemStyleDone兩種型別,差別貌似不大
UIBarButtonItem *barBtn1=[[UIBarButtonItem alloc]initWithTitle:@"左邊" style:UIBarButtonItemStylePlain target:self action:@selector(changeColor)];
self.navigationItem.leftBarButtonItem=barBtn1;
//我們還能夠在左邊和右邊加不止一個button。,且能夠加入隨意檢視,以右邊為例
//加入多個事實上就是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中:
#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];
//設定導航標題,這個時候的返回button的title就是上一級的navigationItem的title文字
[self.navigationItem setTitle:@"子頁"];
//我們也能夠在子頁中自己定義一個返回button覆蓋原先的"<back"
UIBarButtonItem *barBtn5=[[UIBarButtonItem alloc]initWithTitle:@"回家" style:UIBarButtonItemStylePlain target:self action:@selector(backTo)];
self.navigationItem.leftBarButtonItem=barBtn5;
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)backTo{
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
}
@end
截個圖: