⼀、UINavigationController佈局
UINavigationController:導航控制器,是iOS中最常⽤的多視圖控制器 之⼀,它⽤來管理多個視圖控制器。 導航控制器能夠認爲是管理控制器的控制器,主要管理有層級關係的控制器。atom
UINavigationController繼承於UIViewController,以棧的⽅式管理所 控制的視圖控制器,⾄少要有⼀個被管理的視圖控制器,這個控制器 咱們稱做,導航控制器的根視圖控制器。 任何繼承⾃UIViewController的類(多態)均可以做爲根控制器。spa
一、⼯做原理代理
UINavigationController經過棧的⽅式管理控制器的切換,控制⼊棧和出棧來展⽰各個視圖控制器。對象
UINavigationController的ContentView⾥始終顯⽰棧頂控制器的view。繼承
viewControllers屬性存儲了棧中的全部被管理的控制器事件
navigationController屬性,⽗類中的屬性,每一個在棧中的控制器,都能經過此屬性,獲取⾃⼰所在的UINavigationController對象。圖片
二、⼊棧和出棧get
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; //進⼊下⼀個視圖控制器it
- (UIViewController *)popViewControllerAnimated:(BOOL)animated; //返回上⼀個視圖控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; //返回到指定的視圖控制器
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; //返回到根視圖控制器
三、常⽤屬性
viewControllers //全部處於棧中的控制器
topViewController //位於棧頂的控制器
visibleViewController //當前正在顯⽰的控制器
navigationBar //導航條
⼆、定製UINavigationBar
navigationBar—導航條,iOS7以後默認是透明的,iOS7以前默認是不 透明的。
navigationBar在透明狀況,與contentView會重合⼀部分區域。 navigationBar在不透明狀況,contentView跟在navigationBar的下⾯。 navigationBar豎屏下默認⾼度44,橫屏下默認⾼度32.
一、管理UINavigationItem
UINavigationBar也是以棧的⽅式管 理⼀組UINavigationItem。提供push和pop操做item。
每一個視圖控制器都有⼀個navigationItem屬性。navigationItem中設 置的左按鈕、右按鈕、標題等,會隨着控制器的顯⽰,也顯⽰到 navigationBar上
UINavigationBar
barStyle 樣式
translucent 透明度:YES時佈局從狀態欄頂端開始。NO時佈局從狀態欄底端開始
tintColor 顏色
backgroundImage: 背景圖片
//設置導航欄的barStyle(樣式)和translucent
//白色(默認)
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
self.navigationController.navigationBar.translucent = YES; //(半透明)
self.navigationController.navigationBar.translucent = NO; //(不透明)
//黑色
// self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//設置導航欄的barTintColor
self.navigationController.navigationBar.barTintColor = [[UIColor brownColor] colorWithAlphaComponent:0.3];
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
////設置導航欄的backgroundImage,像素:64,44,小於44
// 64
UIImage *image = [UIImage imageNamed:@"NavBar_64"];
[self.navigationController.navigationItem setPrompt:@"Prompt"];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
二、UINavigationItem
UINavigationItem屬於MVC中的M。封裝了要顯⽰在UINavigationBar上的數據。
title //標題
titleView //標題視圖
leftBarButtonItem //左按鈕
rightBarButtonItem //右按鈕
//1、每個導航控制器(NavigationController),有且只有一個導航欄(NavigationBar)
//2、導航欄上面展現的都是UINavigationItem裏面的內容
//3、每個視圖控制器都有一個navigationItem
//設置導航欄上的UIBarButtonItem,三種設置方式
//a.系統樣式
// UIBarButtonItem *rightBI = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(clickRightBI:)];
//b.使用title初始化設置UIBarButtonItem
UIBarButtonItem *rightBI = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain target:self action:@selector(clickRightBI:)];
//c.使用image初始化UIBarButtonItem,此時,image須要進行渲染設置,默認渲染爲模版方式。須要將image渲染方式設置爲原圖方式
UIImage *image1 = [UIImage imageNamed:@"NavBtnLeft"];
UIImage *image2 = [image1 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem *leftBI = [[UIBarButtonItem alloc] initWithImage:image2 style:UIBarButtonItemStylePlain target:self action:@selector(clickRightBI:)];
//添加Bar
self.navigationItem.leftBarButtonItem = leftBI;
[leftBI release];
self.navigationItem.rightBarButtonItem = rightBI;
[rightBI release];
//設置導航欄上要顯示的title
self.navigationItem.title = @"登陸頁面";
//設置導航欄上要顯示的titleView
self.navigationItem.titleView = [[UISegmentedControl alloc] initWithItems:@[@"消息", @"電話"]];
三、UIBarButtonItem
UIBarButtonItem屬於MVC的M。定義了UINavigationItem上按鈕的觸
發事件,外觀等
-initWithBarButtonSystemItem:target:action:
-initWithTitle:style:target:action:
-initWithImage:style:target:action:
tintColor
四、結構
3、界⾯間通訊
一、屬性傳值
RegisterViewController.h
@property(nonatomic, retain) NSString *text;
LoginViewController.h
registerVC.text = @"someString";
二、代理傳值
1.建立協議
RegisterViewControllerDelegate.h
#import <Foundation/Foundation.h>
@class NSString;
@protocol RegisterViewControllerDelegate <NSObject>
- (void)sendValue:(NSString *)text;
@end
2.遵照、實現協議
LoginViewController.h
#import <UIKit/UIKit.h>
#import "RegisterViewControllerDelegate.h"
@interface LoginViewController : UIViewController<RegisterViewControllerDelegate>
@end
LoginViewController.m
- (void)sendValue:(NSString *)text
{
_label.text = text;
}
3.使用代理
RegisterViewController.h
//注意:聲明一個代理屬性,(由於registerVC是委託人,它要擁有一個代理屬性,用來設置代理)
@property(nonatomic, assign)id<RegisterViewControllerDelegate> delegate;
RegisterViewController.m
- (void)clickBI:(UIBarButtonItem *)BI
{
[self.navigationController popViewControllerAnimated:YES];
[_delegate sendValue:@"hello"];
}
4.設置代理
LoginViewController.m
- (void)clickBI:(UIBarButtonItem *)BI
{
RegisterViewController *registVC = [[RegisterViewController alloc] init];
registVC.delegate = self;
[self.navigationController pushViewController:registVC animated:YES];
}