[iOS功能]- UINavigationBar的设置

image

UINavigationBar

在此,我们先了解下UINavigationController的层次图,有助于我们更加的了解UINavigationBar。

image

UINavigationController 层次

所以通俗地说就是,UINavigationController是个容器,里面可以装很多UIViewController。装这么多UIViewController让用户怎么控制它们呢,总得有个工具吧。这个工具就是UINavigationBar。一个容器就这么一个bar,相当于控制台吧。但是,管理那么多UIViewController,控制台上得按钮啊、标题啊,都千篇一律是不是看起来太无聊了。为了解决这个问题,UINavigationController为每个UIViewController生成一个UINavigationBarItem,通过这个UINavigationBarItem可以改变控制台“上面”得按钮和标题。

简单的说,UINavigationBar是UINavigationController的一个组成部分,就是上面的那个导航栏。UINavigationBar又有UINavigationItem组成。UINavigationItem则有title,按钮,提示文本等组成,就是我们看到的title文字,右上角的按钮。

NavigationItem在NavigationBar代表一个ViewController,具体一点儿来说就是每一个加到NavigationController的viewController都会有一个对应的NavigationItem.

一个导航控制器控制多个视图,NavigationBar上的leftItem,rightItem,title是由当前的视图控制器控制的。

一、基本用法

image

一、基本用法

self.title = @"TestTitle";
// 与下面相同
//self.navigationItem.title = @"TestTitle";
rightItemself.navigationItem.rightBarButtonItem = [[UIBarButtonItemalloc] initWithTitle:@"Done"style:UIBarButtonItemStyleDonetarget:selfaction:@selector(doneTestAction)];
leftItemself.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(cancelTestAction)];

二、改变颜色

image

二、改变颜色

注意 title的颜色改变和 Item处的颜色方法是不同的

//改变颜色
self.navigationController.navigationBar.barTintColor = [UIColorblueColor];
//改变title颜色
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColorredColor]  };
//改变 Item颜色
self.navigationController.navigationBar.tintColor = [UIColorwhiteColor];

一般我们也常用下面这个方法改变,但是要注意我们一般只在AppDelegate中有效,或者是 UINavagaitonController中的 RootController 中设置有效,而且只有纯代码的时候才有效。storyboard 在根视图中设置也是没有效果的,以及其他的子视图单独设置都是没有效果的哦。

[[UINavigationBarappearance] setTintColor:[UIColorwhiteColor]];
[UINavigationBarappearance].titleTextAttributes =@{NSForegroundColorAttributeName: [UIColorwhiteColor]                                                    };
[[UINavigationBarappearance] setBarTintColor:[UIColorblueColor]];

当然也可一直用用图片改变的

[[UINavigationBarappearance] setBackgroundImage:[UIImageimageNamed:@"nav"] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:[UIImageimageNamed:@"nav"]  forBarMetrics:UIBarMetricsDefault];

三、隐藏导航栏

self.navigationController.navigationBar.hidden =YES;
image

状态栏挡住了

但是注意有时状态栏确是不会消失哦,解决这个问题则需要涉及到下面这个问题啦,提到edgesForExtendedLayout

self.edgesForExtendedLayout =UIRectEdgeNone;

edgesForExtendedLayout是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向。 因为iOS7鼓励全屏布局,它的默认值很自然地是UIRectEdgeAll,四周边缘均延伸,就是说,如果即使视图中上有NavigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。

导航栏动态的消失

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

此处注意navigationBar.hidden与navigationBarHidden的区别

两种方法都是可以隐藏导航栏的,隐藏之后依然可以使用push和pop方法。但是如果用navigationBar.hidden隐藏导航栏,我们可以继续使用navigationBarHidden提供的滑动pop效果,如果用navigationBarHidden,这个操作将无效;但前者navigationBar.hidden没有系统自动的动画效果。

ps 对状态栏处的处理:

此时注意 iOS 7 之后,我们改变状态栏的情况对plist info 的View controller-based status bar appearance设置为YES,则状态栏会根据各个UIViewController的配置改变,UIViewController中如果需要改变状态栏则需要重载以下两个方法:

//状态栏是否隐藏
- (BOOL)prefersStatusBarHidden;
//状态栏样式
-(UIStatusBarStyle)preferredStatusBarStyle;

如果View controller-based status bar appearance为NO,则标示状态栏不受UIViewController的单独控制,那么这个时候状态栏的控制还和iOS7以前的方式一样,在需要修改的地方执行setStatusBarHidden。

[UIApplicationsharedApplication].statusBarStyle =UIStatusBarStyleLightContent;

这样状态栏就变成白色啦,但是 iOS 9之后 还是用前一种方法的,重写一下下面这个方法的。

- (UIStatusBarStyle)preferredStatusBarStyle;

四、屏幕原点的改变

此处不对比了 iOS 7之前的,ios6, 确实是从status bar下面开始布局 (0,20),iOS 7之后都是从status bar 左上角(0,0)开始布局的,但是有时,我们也会遇到在 NavigationController 中是以(0,64)布局的,此处又是什么情况呢?先来看一下下面三个属性:

**extendedLayoutIncludesOpaqueBars**

默认值NO,这个属性指定了当Bar使用了不透明图片时,视图是否延伸至Bar所在区域;因此,如果我们自定义了nav bar背景图片,view会从导航栏下面开始布局。

**edgesForExtendedLayout**

默认是UIRectEdgeAll,也就是全屏布局(iOS7中鼓励这样,这样可以透过半透明的bar看到一些模模糊糊的内容),如果设置为UIExtendedEdgeNone,view就不会延伸到bar的后面了

**automaticallyAdjustsScrollViewInsets**

默认值是YES,如果视图里面存在唯一一个UIScrollView或其子类View,,那么它会自动设置相应的内边距(如果有navbar的时候,这个内边距是64,这样scrollview可以占满屏幕,内容在64像素以下,不会被遮到,滑动scrollview,可以透过半透明效果看到scrollview上面的内容)

所以说有时,我们发现原点位置变化了,就可以看看上述几个属性是否有设置改动的。经常我们用到 tableView 或 collectionView 的时候就需要设置 self.automaticallyAdjustsScrollViewInsets = NO, 不让其自动调整。

转自:https://www.jianshu.com/p/d8b1ae461fa3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352