nav图文讲解(总结)

  1. 首先是导航控制器下的视图结构
图片.png
  • 导航控制器的三个区:
    导航区:导航控制器的navigationBar,管NSArray<UINavigationItem *> *items;数组
    内容区:用于展示导航控制器字控制器的视图
    toolbar区:底部工具条,默认隐藏

  • 导航条的隐藏和展示:
    通过navigationBar.translucent = YES/NO调节。
    透明情况下:
    内容区从屏幕顶部开始, 控制器view的frame为 0 0 screenW screenH(控制器的View的frame相对于UIViewControllerWrapperView计算)
    透明情况下,让控制器的展示区从导航条底部开始:self.edgesForExtendedLayout = UIRectEdgeNone;设置后,展示区的高度同样-64px。同时automaticallyAdjustsScrollViewInsets失效,scrollView的bounds不自动下移。
    测试:UIViewControllerWrapperView = self.view.superView。更改bounds也可以让self.view下移64,
    导航条不透明情况下:
    展示区从导航条下开始 。
    导航条不透明情况让展示区顶部从屏幕顶部开始:self.extendedLayoutIncludesOpaqueBars = YES; 同时automaticallyAdjustsScrollViewInsets生效。同时automaticallyAdjustsScrollViewInsets自动生效,scrollView的bounds自动下移。

    无论导航条是否透明,UILayoutContainerView、UINavigationTransitionView、UIViewControllerWrapperView都是和屏幕尺寸一致的,变化的只是展示区域的frame,即子控制器的view的frame。
    测试:导航控制器下view加载:只要在控制器view不是从顶部0开始的情况下,控制器的view的y和height都是不准确的,当子控制器的viewDidAppear的时候,它的frame是会被重新定义成展示区的尺寸。我把展示区理解成子控制器viewDidAppear后的frame。

  • 导航条透明度的调节:
    方法一:通过setBackgroundImage调节。
    viewDidLoad、viewWillAppear设置setBackgroundImage为一张透明度为1.0的图片话,相当于设置navigationBar.translucent = NO,展示区下移64px,高度减少64px。
    viewDidAppear设置setBackgroundImage为一张透明度为1.0的图片话,相当于设置navigationBar.translucent = NO。但是当前控制器不会显现,展示区还是0px,高度还是屏幕的尺寸,内部的scrollView的bounds还是会自动加64px。pop回上一层控制器后,展示区下移64px,高度减少64px。如果设置setBackgroundImage为一张透明度小于1.0的图片话,就不会出现navigationBar.translucent状态不会修改。

解决的设置非透明图片后,顶栏透明自动关闭的问题:
viewDidLoad设置
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:JKRColor(255, 255, 0, 1.0)] forBarMetrics:UIBarMetricsDefault];
self.extendedLayoutIncludesOpaqueBars = YES;

viewWillDisappear设置
self.navigationController.navigationBar.translucent = YES;

解决设置完setBackgroundImage为一张非透明图片之后,展示区顶部回到0位置:再设置self.navigationController.navigationBar.translucent = YES;会回恢复展示区y为0的位置,但是设置的图片会自动加一些透明度。


1.png

会出现的问题:如果设置setBackgroundImage同时设置barTinkColor,那么图片透明会漏出_UIBarBackground的颜色。
如果设置上一级的控制器设置了setBackgroundImage,下一级的控制器设置setBackgroundImage图片为透明色后,底部_UIBarBackground的变为不透明,漏出黑色,不能穿透显示底部视图。


2.png

方法二:通过修改_UIBarBackground的背景色
图片.png

首先viewDidLoad中定义当前控制器的导航条为非透明状态,展示区不自动下移。
设置导航条背景色被透明。
遍历导航条获取到_UIBarBackground
根据透明度设置其颜色
pop时,即viewWillDisappear时重新定义导航条为透明

遇到的问题:当侧滑并返回不POP的时候,当前控制器的导航条的_UIBarBackground背景色虽然透明,但是导航条还是白色,观察发现,因为POP一半的时候走了viewWillDisappear并执行self.navigationController.navigationBar.translucent = YES;返回的时候,导致导航条内部增加了UIVisualEffectView。我尝试在viewDidAppear中遍历出这个视图移除,但是没有效果。发现控制器的view加载成功后,再次对导航条修改必须要等viewDidAppear后一段时间才可以,没有找出来原因。代码如下:


815022546DBD4216142B3EF205E5F066.png
907B3330DDA5682F7CB97A1C7F077402.gif

5.导航条下划线的隐藏:
方法一:设置navigationBar的clipsToBounds。问题:navigationBar为44高度,有背景色的时候会发现问题。
方法二:遍历出下划线的UIImageView并隐藏。原理:因为下划线的高度为0.333,以高度不大于0.4为条件便利导航条的子视图。

6.Item间距问题。
UIBarButtonItem *itemGap = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
itemGap.width = 80;
把间距的item添加到items对象数组中要添加间距的两个对象之间即可

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

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,473评论 1 14
  • 废话不多说,直接上干货 ---------------------------------------------...
    小小赵纸农阅读 3,336评论 0 15
  • 梦,梦的序曲在无意间奏响,那是一段漫长的梦… 梦,我做了一个梦,每天都做着相同的梦,一个永无止境的梦,梦境幻灭的那...
    羽翼的轨迹阅读 286评论 0 1
  • 上午程程拍完复检胸片,我们坐在医院的走廊里等结果。眼前是大大小小的脚步来去匆匆,每个大人脸上都焦虑不安,许多孩子眼...
    杨榆阅读 386评论 2 1
  • 究竟是怎么了?我…… 她手放在木榻上,摸到了那一把艳红色的长刀。 像是淬炼时经过樱花的点缀,斑驳,妖媚。 刀刃那种...
    亦黎阅读 327评论 0 1