UINavigationBar 的某些事

NavigationBar 是我們常用的乌妒,昨天想到了一個 手機 QQ 空間狀態(tài)處對于 NavigationBar 處的處理评凝,特此總結(jié)下這方面的追葡。

UINavigationBar

在此,我們先了解下UINavigationController的層次圖肥哎,有助于我們更加的了解UINavigationBar辽俗。

UINavigationController 層次

所以通俗地說就是,UINavigationController是個容器篡诽,里面可以裝很多UIViewController崖飘。裝這么多UIViewController讓用戶怎么控制它們呢,總得有個工具吧杈女。這個工具就是UINavigationBar朱浴。一個容器就這么一個bar吊圾,相當(dāng)于控制臺吧。但是翰蠢,管理那么多UIViewController项乒,控制臺上得按鈕啊、標(biāo)題啊梁沧,都千篇一律是不是看起來太無聊了檀何。為了解決這個問題,UINavigationController為每個UIViewController生成一個UINavigationBarItem廷支,通過這個UINavigationBarItem可以改變控制臺“上面”得按鈕和標(biāo)題频鉴。

簡單的說,UINavigationBar是UINavigationController的一個組成部分恋拍,就是上面的那個導(dǎo)航欄垛孔。UINavigationBar又有UINavigationItem組成。UINavigationItem則有title施敢,按鈕周荐,提示文本等組成,就是我們看到的title文字僵娃,右上角的按鈕概作。

  • NavigationItem在NavigationBar代表一個ViewController,具體一點兒來說就是每一個加到NavigationController的viewController都會有一個對應(yīng)的NavigationItem.
  • 一個導(dǎo)航控制器控制多個視圖默怨,NavigationBar上的leftItem,rightItem,title是由當(dāng)前的視圖控制器控制的仆嗦。
一、基本用法
一先壕、基本用法
self.title = @"TestTitle";// 與下面相同
//self.navigationItem.title = @"TestTitle";

// rightItem
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
                                              initWithTitle:@"Done"
                                              style:UIBarButtonItemStyleDone
                                              target:self
                                              action:@selector(doneTestAction)];
// leftItem
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                                             initWithTitle:@"Cancel"
                                             style:UIBarButtonItemStylePlain
                                             target:self
                                             action:@selector(cancelTestAction)];
二、改變顏色
二谆甜、改變顏色

注意 title的顏色改變和 Item處的顏色方法是不同的

//改變顏色
self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
//改變title顏色
self.navigationController.navigationBar.titleTextAttributes = @{
                        NSForegroundColorAttributeName : [UIColor redColor]
                                                               };
//改變 Item顏色
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

一般我們也常用下面這個方法改變垃僚,但是要注意我們一般只在AppDelegate中有效,或者是 UINavagaitonController中的 RootController 中設(shè)置有效规辱,而且只有純代碼的時候才有效谆棺。storyboard 在根視圖中設(shè)置也是沒有效果的,以及其他的子視圖單獨設(shè)置都是沒有效果的哦罕袋。

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
[UINavigationBar appearance].titleTextAttributes =@{
                        NSForegroundColorAttributeName : [UIColor whiteColor]
                                                    };
[[UINavigationBar appearance] setBarTintColor:[UIColor blueColor]];

當(dāng)然也可一直用用圖片改變的

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav"] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav"]  forBarMetrics:UIBarMetricsDefault];
三改淑、隱藏導(dǎo)航欄
self.navigationController.navigationBar.hidden = YES;
狀態(tài)欄擋住了

但是注意有時狀態(tài)欄確是不會消失哦,解決這個問題則需要涉及到下面這個問題啦浴讯,提到edgesForExtendedLayout

self.edgesForExtendedLayout = UIRectEdgeNone;

edgesForExtendedLayout是一個類型為UIExtendedEdge的屬性朵夏,指定邊緣要延伸的方向。 因為iOS7鼓勵全屏布局榆纽,它的默認值很自然地是UIRectEdgeAll仰猖,四周邊緣均延伸捏肢,就是說,如果即使視圖中上有NavigationBar饥侵,下有tabBar鸵赫,那么視圖仍會延伸覆蓋到四周的區(qū)域。

導(dǎo)航欄動態(tài)的消失

if (scrollView.contentOffset.y > 64) {
    
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}
else
{
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

此處注意navigationBar.hidden與navigationBarHidden的區(qū)別

兩種方法都是可以隱藏導(dǎo)航欄的躏升,隱藏之后依然可以使用push和pop方法辩棒。但是如果用navigationBar.hidden隱藏導(dǎo)航欄鬼吵,我們可以繼續(xù)使用navigationBarHidden提供的滑動pop效果嚎莉,如果用navigationBarHidden奏夫,這個操作將無效序目;但前者navigationBar.hidden沒有系統(tǒng)自動的動畫效果今布。

ps 對狀態(tài)欄處的處理:

此時注意 iOS 7 之后帘靡,我們改變狀態(tài)欄的情況對plist info 的View controller-based status bar appearance設(shè)置為YES拒秘,則狀態(tài)欄會根據(jù)各個UIViewController的配置改變渺杉,UIViewController中如果需要改變狀態(tài)欄則需要重載以下兩個方法:

//狀態(tài)欄是否隱藏
- (BOOL)prefersStatusBarHidden;
//狀態(tài)欄樣式
- (UIStatusBarStyle)preferredStatusBarStyle;

如果View controller-based status bar appearance為NO双霍,則標(biāo)示狀態(tài)欄不受UIViewController的單獨控制砚偶,那么這個時候狀態(tài)欄的控制還和iOS7以前的方式一樣,在需要修改的地方執(zhí)行setStatusBarHidden洒闸。

 [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

這樣狀態(tài)欄就變成白色啦染坯,但是 iOS 9之后 還是用前一種方法的,重寫一下下面這個方法的丘逸。

- (UIStatusBarStyle)preferredStatusBarStyle;

四单鹿、屏幕原點的改變

此處不對比了 iOS 7之前的,ios6, 確實是從status bar下面開始布局 (0,20)深纲,iOS 7之后都是從status bar 左上角(0仲锄,0)開始布局的,但是有時湃鹊,我們也會遇到在 NavigationController 中是以(0儒喊,64)布局的,此處又是什么情況呢币呵?先來看一下下面三個屬性:

  • extendedLayoutIncludesOpaqueBars
    默認值NO怀愧,這個屬性指定了當(dāng)Bar使用了不透明圖片時,視圖是否延伸至Bar所在區(qū)域余赢;因此芯义,如果我們自定義了nav bar背景圖片,view會從導(dǎo)航欄下面開始布局妻柒。
  • edgesForExtendedLayout
    默認是UIRectEdgeAll扛拨,也就是全屏布局(iOS7中鼓勵這樣,這樣可以透過半透明的bar看到一些模模糊糊的內(nèi)容)蛤奢,如果設(shè)置為UIExtendedEdgeNone鬼癣,view就不會延伸到bar的后面了
  • automaticallyAdjustsScrollViewInsets
    默認值是YES陶贼,如果視圖里面存在唯一一個UIScrollView或其子類View,待秃,那么它會自動設(shè)置相應(yīng)的內(nèi)邊距(如果有navbar的時候拜秧,這個內(nèi)邊距是64,這樣scrollview可以占滿屏幕章郁,內(nèi)容在64像素以下枉氮,不會被遮到,滑動scrollview暖庄,可以透過半透明效果看到scrollview上面的內(nèi)容)

所以說有時聊替,我們發(fā)現(xiàn)原點位置變化了,就可以看看上述幾個屬性是否有設(shè)置改動的培廓。經(jīng)常我們用到 tableView 或 collectionView 的時候就需要設(shè)置 self.automaticallyAdjustsScrollViewInsets = NO, 不讓其自動調(diào)整惹悄。

備注

http://blog.csdn.net/mad1989/article/details/41516743
http://www.cnblogs.com/ygm900/p/3659619.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肩钠,隨后出現(xiàn)的幾起案子泣港,更是在濱河造成了極大的恐慌,老刑警劉巖价匠,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件当纱,死亡現(xiàn)場離奇詭異,居然都是意外死亡踩窖,警方通過查閱死者的電腦和手機坡氯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋腮,“玉大人箫柳,你說我怎么就攤上這事∩豆” “怎么了滞时?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滤灯。 經(jīng)常有香客問我,道長曼玩,這世上最難降的妖魔是什么鳞骤? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮黍判,結(jié)果婚禮上豫尽,老公的妹妹穿的比我還像新娘。我一直安慰自己顷帖,他們只是感情好美旧,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布渤滞。 她就那樣靜靜地躺著,像睡著了一般榴嗅。 火紅的嫁衣襯著肌膚如雪妄呕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天嗽测,我揣著相機與錄音绪励,去河邊找鬼。 笑死唠粥,一個胖子當(dāng)著我的面吹牛疏魏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晤愧,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼大莫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了官份?” 一聲冷哼從身側(cè)響起只厘,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贯吓,沒想到半個月后懈凹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡悄谐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年介评,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬舰。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡们陆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出情屹,到底是詐尸還是另有隱情坪仇,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布垃你,位于F島的核電站椅文,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惜颇。R本人自食惡果不足惜皆刺,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凌摄。 院中可真熱鬧羡蛾,春花似錦、人聲如沸锨亏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浪藻,卻和暖如春捐迫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珠移。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工弓乙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钧惧。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓暇韧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浓瞪。 傳聞我的和親對象是個殘疾皇子懈玻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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