【iOS開發-22】navigationBar導航欄,navigationItem建立:獲取導航欄中的基本文字和button以及各種跳躍...

weixin_34126215發表於2015-12-09

(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

截個圖:


相關文章