iOS_UI_07_UINavigationController

第七章 UINavigationController

一、UINavigationController
1.UINavigationController:導(dǎo)航控制器,多視圖控制器,管理多個(gè)視圖控制器,稱(chēng)為管理控制器的控制器,主要管理有層次遞進(jìn)關(guān)系的控制器
2.UINavigationController:繼承于UIViewController,以棧的方式管理所控制的視圖控制器,至少要有一個(gè)被管理的視圖控制器,這個(gè)控制器我們稱(chēng)為導(dǎo)航控制器的根視圖控制器,任何繼承自UIViewController的類(lèi)(多態(tài))都可以作為根視圖控制器
    //導(dǎo)航控制器的使用 ,導(dǎo)航控制器的初始化方式一般需要帶根視圖控制器,導(dǎo)航控制器是用來(lái)管理一組有序的視圖控制器的視圖控制器,他只負(fù)責(zé)管理視圖控制器之間的切換,不負(fù)責(zé)內(nèi)容的呈現(xiàn)。所以起碼需要管理一個(gè)視圖控制器。
    //第一步:創(chuàng)建導(dǎo)航控制器的根視圖控制器
    ViewController* rootVC = [[ViewController alloc] init];
    //第二步:
    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:rootVC];
    //第三步:將導(dǎo)航控制器設(shè)置為window的根視圖控制器
    self.window.rootViewController = navigationController
二、UINavigationBar
1.UINavigationBar(導(dǎo)航欄):兩部分,一為導(dǎo)航欄上的各種導(dǎo)航部件(UINavigationItem),二為導(dǎo)航欄自身的相關(guān)設(shè)置
2.navigationBar:導(dǎo)航條,iOS 7 之后默認(rèn)是半透明的,之前是不透明的
3.navigationBar豎屏下默認(rèn)高度為44,橫屏默認(rèn)高度為32,狀態(tài)欄(statusBar)高度為20---iOS 7之后,navigationBar的背景會(huì)延伸到狀態(tài)欄(statusBar)上,導(dǎo)航欄高為仍保持44,但顯示效果為64
4.每個(gè)視圖控制器都有一個(gè)navigationItem屬性,navigationItem中設(shè)置左按鈕、右按鈕、標(biāo)題等,會(huì)隨著控制器的顯示,也顯示在navigationBar上
5.navigationItem的屬性
    1.設(shè)置標(biāo)題
         self.title = @"標(biāo)題";---tong'shi'gai'bian'dao'hang'lan'de'biao'ti'he同時(shí)改變導(dǎo)航欄的標(biāo)題和tabBar的標(biāo)題
         self.navigationItem.title = @"標(biāo)題"---單獨(dú)操作導(dǎo)航欄標(biāo)題
    2.設(shè)置左按鈕、右按鈕---間接繼承與NSobject,不是按鈕控件
       self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(leftAction)] autorelease];
    3.創(chuàng)建UIBarButtonItem的初始化方法
       1.initWithImage:style:target:action:---參數(shù)1:圖片--參數(shù)2:barButtonStyle(按鈕樣式,枚舉類(lèi)型)--參數(shù)3;目標(biāo)對(duì)象--參數(shù)4:方法
       2.initWithTitle:style:target:action:---參數(shù)1:按鈕文字--參數(shù)2:barButtonStyle(按鈕樣式,枚舉類(lèi)型)--參數(shù)3;目標(biāo)對(duì)象--參數(shù)4:方法
       3.initWithBarButtonSystemItem:target:action:---參數(shù)1:系統(tǒng)按鈕樣式(枚舉)--參數(shù)2:目標(biāo)對(duì)象--參數(shù)3:方法
       4.initWithCustomView:---參數(shù)1;自定義UIView對(duì)象
    4.左右item數(shù)組---self.navigationItem.leftBarButtonItems = @[item1, item2];
    5.TitleView標(biāo)題視圖---titleView
       self.navigationItem.titleView = segmentC;
    6.導(dǎo)航欄的顯隱屬性---self.navigationController.navigationBarHidden = NO;
    7.導(dǎo)航欄樣式---self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    8.背景顏色---self.navigationController.navigationBar.backgroundColor = [UIColor redColor];
    9.導(dǎo)航欄顏色---self.navigationController.navigationBar.barTintColor = [UIColor yellowColor];
    10.導(dǎo)航欄元素顏色---self.navigationController.navigationBar.tintColor = [UIColor blackColor];
    11.導(dǎo)航欄的半透明效果---默認(rèn)開(kāi)啟YES
       半透明效果開(kāi)啟時(shí),屏幕左上角為坐標(biāo)原點(diǎn)
       半透明關(guān)閉時(shí),導(dǎo)航欄左下角為坐標(biāo)原點(diǎn)
       self.navigationController.navigation Bar.translucent = YES;
三、頁(yè)面跳轉(zhuǎn)
1.工作原理:UINavigationController通過(guò)棧的方式管理控制器的切換,控制入棧(push)和出棧(pop)來(lái)展示各個(gè)視圖控制器,
2.UINavigationController的ContentView里始終顯示棧頂控制器的View。
3.viewControllers屬性是一個(gè)可變數(shù)組(NSMutableArray)存儲(chǔ)了棧中的所有被管理的控制器,入棧的時(shí)候,使用addObject把新的視圖控制器對(duì)象添加到數(shù)組末尾,出棧時(shí)removeLastObject移除數(shù)組末尾的視圖控制器對(duì)象。
4.navigationController屬性,父類(lèi)中的屬性,每個(gè)在棧中的控制器,都能通過(guò)此屬性,獲取自己所在的UINavigationController對(duì)象
5.棧的特點(diǎn):xian'ji先進(jìn)后出,后進(jìn)先出。棧頂為當(dāng)前顯示的視圖控制器
6.常用屬性
      1.viewControllers:所有處于棧中的控制器,使用數(shù)組保存
      2.topViewController:位于棧頂?shù)目刂破?      3.visibleViewController:當(dāng)前顯示的控制器等同于topViewController模態(tài)控制器的原理
      4.navigationBar;導(dǎo)航欄
      5.navigationItem:導(dǎo)航欄控件
7.入棧和出棧的方法
      1.pushViewController:animated:---進(jìn)入下一個(gè)視圖控制器
      2.popViewControllerAnimated:---返回上一個(gè)視圖控制器
      3.popToViewController:animated:---返回指定的視圖控制器
      4.popToRootViewControllerAnimated:---返回根視圖控制器
四、模態(tài)(modal)
1.進(jìn)入下一頁(yè)步驟
      1.創(chuàng)建下一頁(yè)對(duì)象
      2.設(shè)置過(guò)渡動(dòng)畫(huà)(有默認(rèn)值,可以不設(shè)置) ---modalTransitionStyle(枚舉類(lèi)型)
        secVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
      3.模態(tài)控制器---參數(shù)1:下一頁(yè)對(duì)象--參數(shù)2:是否使用動(dòng)畫(huà)--參數(shù):模態(tài)完成后執(zhí)行的block(匿名函數(shù);可以在方法內(nèi)部作為屬性使用,標(biāo)志為倒三角)
         [self presentViewController:secVC animated:YES completion:^{
         
         }];
2.返回上一頁(yè)
     參數(shù)1:是否動(dòng)畫(huà)---參數(shù)2:返回完成后執(zhí)行的block
     [self dismissViewControllerAnimated:YES completion:^{
     
     }];
3.頁(yè)面切換方式對(duì)比
     1.主要分為:推出(push)和模態(tài)(present)
     2.推出(push0用于一系列的視圖之間的跳轉(zhuǎn),有層次遞進(jìn)關(guān)系
     3.模態(tài)(present)用于單獨(dú)功能頁(yè)面的跳轉(zhuǎn)和主要業(yè)務(wù)邏輯沒(méi)有關(guān)聯(lián)(登錄,歌曲播放頁(yè),系統(tǒng)相冊(cè),應(yīng)用中調(diào)用系統(tǒng)功能)

擴(kuò)展
1.MVC的應(yīng)用場(chǎng)景:為導(dǎo)航欄添加按鈕---MVC 的應(yīng)用場(chǎng)景 C:navigationController  V:Bar   M:item
2.讓圖片保持原有,不被系統(tǒng)的顏色所渲染,我們就需要設(shè)置圖片的渲染模式
    UIImage* image = [[UIImage imageNamed:@"11.png"] imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)];
3.視圖出現(xiàn)的生命周期
    1.加載視圖---loadView
    2.加載完畢---viewDidLoad 
    3.視圖即將出現(xiàn)
        - (void)viewWillAppear:(BOOL)animated{
            [super viewWillAppear:animated];
             NSLog(@"%s",__FUNCTION__);
        }
    4.視圖已經(jīng)出現(xiàn)
        - (void)viewDidAppear:(BOOL)animated{
            [super viewDidAppear:animated];
              NSLog(@"%s",__FUNCTION__);
        }
    5.視圖即將消失
        - (void)viewWillDisappear:(BOOL)animated{
            [super viewWillDisappear:animated];
              NSLog(@"%s",__FUNCTION__);
        }
    6.視圖已經(jīng)消失
        - (void)viewDidDisappear:(BOOL)animated{
            [super viewDidDisappear:animated];
              NSLog(@"%s",__FUNCTION__);
        }
4.MRC和ARC下都可以使用dealloc方法,區(qū)別為:MRC:必須在方法的最后加[super dealloc];ARC:不能添加[super dealloc]     

contentInsert:四個(gè)參數(shù):上左下右
1.contentSize是UIScrollView可以滾動(dòng)的區(qū)域。在我的理解中,我把UIScrollView看成是具有上下兩層的一個(gè)復(fù)合視圖,frame控制著上層的大小,我們看到的UIScrollView的大小實(shí)際就是frame的大小,上層固定不動(dòng),顯示的變化,由下層的滾動(dòng)來(lái)控制。而下層滾動(dòng)的區(qū)域的大小,就是由contentSize來(lái)控制的了。例如:若frame = (0, 0, 320, 480) contentSize = (320, 960),代表本UIScrollView可以上下滾動(dòng),滾動(dòng)區(qū)域?yàn)閒rame大小的兩倍。
2.contentOffset是UIScrollView當(dāng)前顯示區(qū)域的頂點(diǎn)相對(duì)于frame頂點(diǎn)的偏移量,例如上面的例子如果拉到最下面,則contentOffset就是(0, 480),也就是y偏移了480.
3.contentInset的API文檔的解釋是"內(nèi)容視圖嵌入到封閉的滾動(dòng)視圖的距離"(哈,英文不是很好,翻譯的不好)。可以理解為內(nèi)容視圖的上下左右四個(gè)邊擴(kuò)展出去的大小。contentInset的單位是UIEdgeInsets,默認(rèn)值為UIEdgeInsetsZero,也就是沒(méi)有擴(kuò)展的邊。下面解釋一下UIEdgeInsets,它是一個(gè)結(jié)構(gòu)體,定義如下:
    typedef struct {  
     CGFloat top, left, bottom, right;  
 }  

scrollsToTop:點(diǎn)擊狀態(tài)欄,返回頂部,默認(rèn)為YES,不需要設(shè)置
SCrollView的tracking屬性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 代碼創(chuàng)建UIWindow對(duì)象 Xcode7之后使用代碼創(chuàng)建UIWindow對(duì)象: //創(chuàng)建UIWindow對(duì)象 s...
    云之君兮鵬閱讀 1,370評(píng)論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,259評(píng)論 4 61
  • 7:15 再不起床就該遲到了。 很不情愿的睜開(kāi)眼,拿起手機(jī)刷下朋友圈,伸個(gè)懶腰自拍一張,“親們,寶寶要起床了,么么...
    走之兔閱讀 980評(píng)論 2 4
  • 除了內(nèi)核產(chǎn)生的文件(proc/sys)或者外來(lái)文件(外部設(shè)備光盤(pán)、U盤(pán))沒(méi)有所有者外,其他一般為垃圾文件 (可以把...
    子木同閱讀 208評(píng)論 0 0
  • 某種程度上中潔網(wǎng)的調(diào)研說(shuō)明了2017年的消費(fèi)狀況,尤其是中產(chǎn)階級(jí)的消費(fèi)狀況(溫水便座買(mǎi)的人還大都是中產(chǎn)階級(jí))
    mavaricklx閱讀 219評(píng)論 0 0