iOS_UI_07_UINavigationController

第七章 UINavigationController

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

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

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

scrollsToTop:點擊狀態欄,返回頂部,默認為YES,不需要設置
SCrollView的tracking屬性
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容