導航視圖控制器基本概念和用法

1.導航視圖控制器的基本概念 

·導航視圖控制器的基本概念
·導航視圖控制器(UINavigationController)是用於構建分層應用程序的主要工 具,管理着多個內容視圖的換入(壓入)和換出(彈出)。自身提供了視圖切換的動畫 效果。
·它的父類是UIViewController,是所有視圖控制器的基類(如下圖所示)。 ·導航控制器是以棧的形式來實現。



棧的概念與性質

·棧的基本概念和性質
   棧是一種數據結構,採用一種先進後出(後進先出)的原則。如,我們把衣服一件一件放到箱子中,就可以看成是一個對象入棧的過程。當需要拿到最底層的衣服,需要把蓋在上層的衣服一層一層拿掉,即後進先出的原則。同理,導航控制器也是以棧的形式來管理視圖控制器,任何視圖控制器都可以放入棧中。 
·向棧中添加一個對象的操作稱爲入棧(push),即把對象推入到了棧裏。
·我們把第一個入棧的對象,叫做基棧。 
·我們把第最後一個入棧的對象,叫做棧頂。 
·我們在棧中刪除一個對象的操作叫做出棧(pop)。 
·當前顯示的視圖控制器,即爲棧頂。選擇“返回”時,這個視圖控制器就出棧了。


導航控制器的基本樣式

·基本樣式
藍色部分爲:導航控制器的導航欄(NavigationBar);
橙色部分爲:控制器包 含的內容視圖(用戶感興趣的區域);
綠色部分爲:導航控制器的工具欄 (UIToolBar),默認是隱藏的;
這些視圖共同構成了導航控制器。



導航控制器的結構圖



導航控制器中視圖元素尺寸



實現導航控制器

一個簡單的導航控制器

// 控制器的初始化,爲控制器添加導航控制器
RootViewController *rootVC = [[RootViewController alloc] init]; UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:rootVC];
// 子控制器設置title,顯示在導航欄上的標題
self.title = @"根控制器";
// 控制器之間的導航
SecondViewController *secondVC = [[SecondViewController alloc] init]; [self.navigationController pushViewController:secondVC animated:YES]; [secondVC release];
// 隱藏(顯示) 導航欄、工具欄目
[self.navigationController setNavigationBarHidden:NO animated:YES]; [self.navigationController setToolbarHidden:NO animated:YES];
// 延遲調用hidden方法,第二個參數是可以傳遞一個對象
[self performSelector:@selector(hidden) withObject:nil afterDelay:0.3];

2、導航控制器常用屬性與常用方法

·導航控制器常用屬性

// 獲取到在棧中最頂層的視圖控制器
@property(nonatomic,readonly,retain) UIViewController *topViewController;


// 獲取到在棧中當前顯示的視圖控制器
@property(nonatomic,readonly,retain) UIViewController *visibleViewController;


// 在棧中當前視圖控制器
@property(nonatomic,copy) NSArray *viewControllers;


// 隱藏導航欄,默認是不隱藏,NO
@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden;


// 獲取到導航欄目
@property(nonatomic,readonly) UINavigationBar *navigationBar;


·常用方法

// 初始化一個根視圖控制器,在棧的最底層
- (id)initWithRootViewController:(UIViewController *)rootViewController;


// 壓入到一個新的視圖控制器中,在棧中最頂層,可以選擇是否需要動畫效果
- (void)pushViewController:(UIViewController *)viewController animated: (BOOL)animated;


// 彈出一個視圖控制器,可以選擇是否需要動畫效果
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;


// 彈出到指定的視圖控制器中,可以選擇是否需要動畫效果
- (NSArray *)popToViewController:(UIViewController *)viewController animated: (BOOL)animated;


// 回到根視圖控制器,可以選擇是否需要動畫效果
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;


導航控制器的層次關係



3 、 UINavigationBar

·導航欄的基本概念
一個導航控制器一般包含有四個對象:UINavigationController、 UINavigationBar、UIViewController、UINavigationItem;其中 NavigationItem存放在UINavigationBar上。由下圖我們可以看出一個導航控制 器含有多個視圖控制器,一個視圖控制器控制器一個UINavigationItem。



·導航欄結構剖析圖 (類關係圖)



導航欄結構圖



定製導航欄

·定製標題視圖
通過NavigationItem的titleView屬性,定製標題視圖。titleView屬性是一個視 圖類,因此可以添加一個UIView的實例,也可以添加UIView子類,也可在UIView 的實例中添加子視圖。

UIView *cView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 160, 44)]; cView = [UIColor redColor];
self.navigationItem.titleView = cView; // self 視圖控制器
[cView release]; // 自定義一個視圖

定製左、右欄目
通過對導航欄的結構我們瞭解到NavigationItem實例中有一個leftBar ButtonItem和rightBarButtonItem,而這個兩個屬性又是一個 UIBarButtonItem的實例,因此,通過初始化UIBarButtonItem實例,設置導航 欄的左、右欄目項。


·定製左、右欄目常用方法
UIBarButtonItem類提供了常用的四個初始化方法,通過這些不同的初始化方 法,用戶可以得到不同風格的Item。如,可以調用系統的定義的Item,也可以調 用用戶自定義的Item(圖片、標題),用戶還可以自定義一個視圖。

// 初始化一個UIBarButtonItem 的實例,初始化一個系統的Item
- (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;
// 初始化一個帶圖片的UIBarbuttonItem
- (id)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;
// 初始化一個只帶標題的UIBarButtonItem實例
- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;
// 初始化自定義的一個視圖
- (id)initWithCustomView:(UIView *)customView;


設置導航欄

·設置風格

// 設置導航欄的風格爲黑色
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
// 設置導航欄爲透明
self.navigationController.navigationBar.translucent = YES;


·設置顏色

// 設置導航欄的顏色
self.navigationController.navigationBar.tintColor = [UIColor redColor];
// 設置自定義顏色,注意每個顏色的值範圍是0-1之間。最後一個參數是設置透明度
[UIColor colorWithRed:0/255.0 green:125/255.0 blue:122/255.0 alpha:1];
// 以圖片作爲顏色,注意這裏是無法設置NavigationBar
[UIColor colorWithPatternImage:[UIImage imageNamed:@"img.png"]];


·隱藏返回按鈕

// 隱藏返回按鈕,後者帶動畫效果

[self.navigationItem setHidesBackButton:YES];

[self.navigationController setToolbarHidden:YES animated:YES];


·設置prompt屬性

導航欄的prompt屬性,通過navigationItem來設置,其主要作用是用於提示用 戶。比如,用戶正在請求網絡數據時,提示用戶數據正在加載。待加載完成後可以 將它的值設置爲nil,取消顯示。

// 設置導航欄提示用戶的內容
self.navigationItem.prompt=@"加載數據";
// 取消提示
// 設置導航欄提示用戶的內容
self.navigationItem.prompt=nil;




4、導航控制器中的工具欄

·創建UIToolBar的實例

UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,460-88, 320, 44)];

// 初始化UIToolBar的 UIBarButtonItem實例,與UINavigationItem 中左、右欄目相同的
UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"天氣" style:UIBarButtonItemStyleBordered target:self action:nil];

// 向UIToolBar添加UIBarButtonItem
NSArray *itemsArray = [NSArray arrayWithObjects:item1, nil]; [self setToolbarItems:itemsArray animated:YES];

    // 如何設置UIToolbar的間隔。前者是item之間選擇一個合適的列寬,後者用戶可以自定義item之間的列寬。需要通過UIBarButtonItem的實例的width屬性來設置。
    UIBarButtonSystemItemFlexibleSpace | UIBarButtonSystemItemFixedSpace

·導航控制器中的UIToolBar
在導航控制器中會帶有一個UIToolBar的實例,但默認是隱藏的。如果需要顯 示,需要通過以下方法將其打開:

// 顯示導航控制器
[self.navigationController setToolbarHidden:NO animated:YES];

這裏我們需要注意,與UINavigationBar類似,導航控制器擁有隻擁有一個 UIToolBar實例,但UIToolBar所擁有的UIBarButtonItem實例,是由視圖控制器 管理的。如下代碼所示:

// 將UIBarButtonItem放入數組中,最後添加至UIToolBar中,self表示視圖控制器
[self setToolbarItems:itemsArray animated:YES];
// 以下代碼UIBarButtonItem不會出現在UIToolBar中,且toolbar是隻讀屬性
[self.navigationController.toolbar setItems:itemsArray animated:YES];

5、導航控制器的委託方法

·設置代理方法
·導航控制器的委託方法UINavigationControllerDelegate,通過設置代理監聽視圖 控制器的切換。

self.navigationController.delegate = self; //設置代理方法

// 視圖控制器將要顯示時調用
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
// 視圖控制器已經顯示時調用
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

6、自定義導航欄

我們知道導航欄的背景顏色可以通過“tintColor”來設置。如果需要設置背景, 則需要通過類別修改drawRect方法。5.0以上的SDK提供了設置背景圖片的方 法,這裏我們需要注意版本兼容性的問題。

//  5.0 之前,類別擴展給 UINavigationBar 設定圖片背景
@implementation UINavigationBar (CustomNavigationBar) 
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"image.png"];
    [image drawInRect:rect];
}
@end

// 5.x 新增了 setBackgroundImage 方法來設置背景圖片
 UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:viewController];
[navigation.navigationBar setBackgroundImage:[UIImage imageNamed:@"image.png"] forBarMetrics:UIBarMetricsDefault];

導航控制器小結

·小結
·一個UINavigationController對應一個NavigationBar實例 
·一個UINavigationController可以包含多個UIViewController 
·每一個UIViewController對應一個UINavigationItem實例 
·UINavigationItem控制器多個UIBarButtonItem(2個) 
·一個UINavigationController控制着一個UIToolBar實例
·UIToolBar中的UIBarButtonItem由當前的視圖控制器管理,而不是由導航控制器 控制。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章