NavigationController導(dǎo)航控制器

1显蝌、navigationItem
navigation item在navigation Bar代表一個(gè)viewController坤检,具體一點(diǎn)兒來說就是每一個(gè)加到navigationController的viewController都 會有一個(gè)對應(yīng)的navigationItem凡泣,該對象由viewController以懶加載的方式創(chuàng)建峡扩,稍后我們可以在對象中對 navigationItem進(jìn)行配置踱蠢,可以設(shè)置leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title以及prompt等屬性汁汗。?前三個(gè)每一個(gè)都是一個(gè)UIBarButtonItem對象,最后兩個(gè)屬性是一個(gè)NSString類型描述妇斤,注意添加該 描述以后NavigationBar的高度會增加30摇锋,總的高度會變成74(不管當(dāng)前方向是Portrait還是Landscape,此模式下 navgationbar都使用高度44加上prompt30的方式進(jìn)行顯示)站超。當(dāng)然如果覺得只是設(shè)置文字的title不夠爽荸恕,你還可以通過 titleview屬性指定一個(gè)定制的titleview,這樣你就可以隨心所欲了死相,當(dāng)然注意指定的titleview的frame大小融求,不要顯示出界。

2算撮、titleTextAttributes(ios5.0以后可用)
這是UINavigationBar的一個(gè)屬性生宛,通過它你可以設(shè)置title部分的字體,這個(gè)屬性定義

NSDictionary *dict = [NSDictionary dictionaryWithObject:[UIColor yellowColor] forKey:UITextAttributeTextColor]; childOne.navigationController.navigationBar.titleTextAttributes = dict;?
3肮柜、wantsFullScreenLayout
viewController的一個(gè)屬性陷舅,這個(gè)屬性默認(rèn)值是NO,如果設(shè)置為YES的 話审洞,如果statusbar莱睁,navigationbar, toolbar是半透明的話,viewController的view就會縮放延伸到它們下面芒澜,但注意一點(diǎn)兒tabBar不在范圍內(nèi)仰剿,即無論該屬性是否為 YES,view都不會覆蓋到tabbar的下方痴晦。

4南吮、navigationBar中的stack
這個(gè)屬性可以算是UINavigationController的靈魂之一,它維護(hù)了一 個(gè)和UINavigationController中viewControllers對應(yīng)的navigationItem的stack阅酪,該stack用于 負(fù)責(zé)navigationbar的刷新旨袒。“注意:如果navigationbar中navigationItem的stack和對應(yīng)的 NavigationController中viewController的stack是一一對應(yīng)的關(guān)系术辐,如果兩個(gè)stack不同步就會拋出異常砚尽。

下面舉個(gè)簡單拋出異常的例子:

SvNavChildViewController *childOne = [[SvNavChildViewController alloc] initWithTitle:@"First" content:@"1"];  
[self.navigationController pushViewController:childOne animated:NO];  
[childOne release];    // raise exception when the stack of navigationbar and navigationController was not correspond [self.navigationController.navigationBar popNavigationItemAnimated:NO];

當(dāng)pushViewcontroller的之后,強(qiáng)制把navigationBar中的navigationItem pop一個(gè)出去辉词,程序立馬掛起必孤。當(dāng)然這純粹只是為了驗(yàn)證問題,一般不會有人這么寫

5瑞躺、navigationBar的刷新
通過前面介紹的內(nèi)容敷搪,我們知道navigationBar中包含了這幾個(gè)重要組成部 分:leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title。當(dāng)一個(gè)view controller添加到navigationController以后幢哨,navigationBar的顯示遵循一下幾個(gè)原則:
1)赡勘、Left side of the navigationBar

a)如果當(dāng)前的viewController設(shè)置了leftBarButtonItem,則顯示當(dāng)前VC所自帶的leftBarButtonItem捞镰。

b)如果當(dāng)前的viewController沒有設(shè)置 leftBarButtonItem闸与,且當(dāng)前VC不是rootVC的時(shí)候,則顯示前一層VC的backBarButtonItem岸售。如果前一層的VC沒有 顯示的指定backBarButtonItem的話践樱,系統(tǒng)將會根據(jù)前一層VC的title屬性自動(dòng)生成一個(gè)back按鈕,并顯示出來凸丸。

c)如果當(dāng)前的viewController沒有設(shè)置leftBarButtonItem拷邢,且當(dāng)前VC已是rootVC的時(shí)候,左邊將不顯示任何東西屎慢。

此處注意:5.0中新增加了一個(gè)屬性 leftItemsSupplementBackButton瞭稼,通過指定該屬性為YES,可以讓leftBarButtonItem和 backBarButtonItem同時(shí)顯示腻惠,其中l(wèi)eftBarButtonItem顯示在backBarButtonItem的右邊弛姜。

2)、title部分

a)如果當(dāng)前VC通過 .navigationItem.titleView指定了自定義的titleView妖枚,系統(tǒng)將會顯示指定的titleView廷臼,此處要注意自定義titleView的高度不要超過navigationBar的高度,否則會顯示出界绝页。

b)如果當(dāng)前VC沒有指定titleView荠商,系統(tǒng)則會根據(jù)當(dāng)前VC的title或者當(dāng) 前VC的navigationItem.title的內(nèi)容創(chuàng)建一個(gè)UILabel并顯示,其中如果指定了navigationItem.title的話续誉, 則優(yōu)先顯示navigationItem.title的內(nèi)容莱没。

3)、Right side of the navigationBar

a)如果當(dāng)前VC指定了rightBarButtonItem的話酷鸦,則顯示指定的內(nèi)容饰躲。

b)如果當(dāng)前VC沒有指定rightBarButtonItem的話牙咏,則不顯示任何東西。

6嘹裂、Toolbar

navigationController自帶了一個(gè)工具欄妄壶,通過設(shè)置 self.navigationController.toolbarHidden = NO來顯示工具欄,工具欄中的內(nèi)容可以通過viewController的toolbarItems來設(shè)置寄狼,顯示的順序和設(shè)置的NSArray中存放的順 序一致丁寄,其中每一個(gè)數(shù)據(jù)都一個(gè)UIBarButtonItem對象,可以使用系統(tǒng)提供的很多常用風(fēng)格的對象泊愧,也可以根據(jù)需求進(jìn)行自定義伊磺。
?7、UINavigationControllerDelegate
這個(gè)代理真的很簡單删咱,就是當(dāng)一個(gè)viewController要顯示的時(shí)候通知一下外面屑埋,給你一個(gè)機(jī)會進(jìn)行設(shè)置,包含如下兩個(gè)函數(shù): 當(dāng)你需要對某些將要顯示的viewController進(jìn)行修改的話痰滋,可實(shí)現(xiàn)該代理

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;  
  
?- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;  

**8雀彼、UINavigationController的viewControllers屬性
**
通過該屬性我們可以實(shí)現(xiàn)一次性替換整個(gè)navigationController的層次, 這個(gè)過程如果通過setViewControllers:animated:來設(shè)置,并指定動(dòng)畫為YES的畫即寡,動(dòng)畫將會從當(dāng)前的navigationController所顯示的vc跳轉(zhuǎn)到所設(shè)置的目標(biāo)viewController的最頂層的那個(gè)VC徊哑,而中間其他的VC將會被直接從VC層級中移除和添加進(jìn)來(沒有動(dòng)畫)。

9聪富、topViewController Vs visibleViewController

topViewController代表當(dāng)前navigation棧中最上層的VC莺丑,而 visibleViewController代表當(dāng)前可見的VC,它可能是topViewController墩蔓,也可能是當(dāng)前 topViewController present出來的VC梢莽。因此UINavigationController的這兩個(gè)屬性通常情況下是一樣,但也有可能不同奸披。

簡單的設(shè)置

navigationItem 凡是要設(shè)置item就可以直接通過navi噶他歐諾Item設(shè)置

navigationBar 導(dǎo)航條(0,20,375,44);默認(rèn)值

設(shè)置title

self.navigationItem.title = @"我是標(biāo)題";

self.title = @"我也是title";

自定義Label

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];  
  
 titleLabel.textAlignment = NSTextAlignmentCenter;?  
  
 titleLabel.textColor = [UIColor redColor];?  
  
titleLabel.text = @"自定義label";?  
  
self.navigationItem.titleView = titleLabel;?  
  
titleView 是可以添加別的控件  
  
  UISwitch *heheSwitch = [UISwitch new];  
  
self.navigationItem.title = @"我又來了";?  
  
  
  
中間天使兩個(gè)item   像[1|2]?  
  
   
  
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil nil nil];    
    UISegmentedControl *segment = [[UISegmentedControl alloc]initWithItems:arr];    
    self.navigationItem.titleView = segment;  
 // 設(shè)置 文本的樣式?

NSDictionary *dict = @{NSFontAttributeName:[UIFont systemFontOfSize:14], NSForegroundColorAttributeName:[UIColor redColor]};? [self.navigationController.navigationBar setTitleTextAttributes:dict];

修改返回按鈕

控制器 a push 到控制器b 中,想要修改返回按鈕的樣式就在控制器a中修改

如果通過這種方式設(shè)置返回樣式, 無法監(jiān)聽按鈕點(diǎn)擊, 被系統(tǒng)攔截掉

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(didClickButotn)];  
  
過 這個(gè)屬性 backBarButtonItem 只能設(shè)置文本     self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil a

設(shè)置左右item
設(shè)置item?

UIButton *btn = [[UIButtonalloc]initWithFrame:CGRectMake(0, 0, 40, 40)];  
  
    [btn setImage:[UIImageimageNamed:@"kongxin"]forState:UIControlStateNormal];  
  
    [btn setImage:[UIImageimageNamed:@"shixin"]forState:UIControlStateSelected];  
  
    [btn addTarget:selfaction:@selector(btnClick:)forControlEvents:UIControlEventTouchUpInside];  
  
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItemalloc]initWithCustomView:btn];  
  
?  
  
 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(didClickButotn)];  
  
? UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil];  
  
  UIBarButtonItem *right1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:nil action:nil];  
  
    self.navigationItem.rightBarButtonItems = @[right,right1];?  

導(dǎo)航欄的設(shè)置?

// 背景顏色  
  
     self.navigationController.navigationBar.backgroundColor = [UIColor redColor];  
  
    // 設(shè)置導(dǎo)航欄主體顏色  
  
?     [self.navigationController.navigationBar setBarTintColor:[UIColor redColor]];  
  
只影響item UIBarButtonItemitem的,如果item為圖片會被渲染顏色, 默認(rèn)是藍(lán)色,   
  
  [self.navigationController.navigationBar setTintColor:[UIColor redColor]];  
  
 UIImage *iconImage = [UIImageimageNamed:@"navigationbar_friendsearch_highlighted"];  
  
      
  
    // 如果不想被渲染成 tintColor  
  
    UIImage *originImage = [iconImageimageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];  
  
 self.navigationItem.leftBarButtonItem = [[UIBarButtonItemalloc]initWithImage:originImage style:UIBarButtonItemStylePlaintarget:nilaction:nil];?  
  
只影響item UIBarButtonItem  
  
    [self.navigationController.navigationBarsetTintColor:[UIColorredColor]];  
  
// 禁用掉高斯模糊, 磨玻璃效果  
  
    self.navigationController.navigationBar.translucent = NO;  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昏名,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阵面,更是在濱河造成了極大的恐慌轻局,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件样刷,死亡現(xiàn)場離奇詭異仑扑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)置鼻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門镇饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箕母,你說我怎么就攤上這事储藐【慵茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵钙勃,是天一觀的道長蛛碌。 經(jīng)常有香客問我,道長肺缕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任授帕,我火速辦了婚禮同木,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跛十。我一直安慰自己彤路,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布芥映。 她就那樣靜靜地躺著洲尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈偏。 梳的紋絲不亂的頭發(fā)上坞嘀,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音惊来,去河邊找鬼丽涩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裁蚁,可吹牛的內(nèi)容都是我干的矢渊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枉证,長吁一口氣:“原來是場噩夢啊……” “哼矮男!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起室谚,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤毡鉴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秒赤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眨补,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年倒脓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撑螺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崎弃,死狀恐怖甘晤,靈堂內(nèi)的尸體忽然破棺而出含潘,到底是詐尸還是另有隱情,我是刑警寧澤线婚,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布遏弱,位于F島的核電站,受9級特大地震影響塞弊,放射性物質(zhì)發(fā)生泄漏漱逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一游沿、第九天 我趴在偏房一處隱蔽的房頂上張望饰抒。 院中可真熱鬧,春花似錦诀黍、人聲如沸袋坑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枣宫。三九已至,卻和暖如春吃环,著一層夾襖步出監(jiān)牢的瞬間也颤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工郁轻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歇拆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓范咨,卻偏偏與公主長得像故觅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子渠啊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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