StoryBoard中自定义UINavigationBar UITabBar 遇到的小问题

     在以前几个项目中都是多人开发,为避免在StoryBoard中代码修改很可能出现的问题,开发中几乎不用StoryBoard。这两天没啥事儿就想着系统的捣鼓一下StoryBoard,看看它究竟是个什么鬼,在实际的开发中会出现什么样的问题。小弟职场菜鸟一枚,大神们嘴下留情,望不吝赐教,不胜感激!


StoryBoard层级关系

一、在StoryBoard中导航栏可以通过拖控件的方式添加Bar Button Item,在导航控制器或者控制器中更改Item的样式,标题的字体的颜色大小等属性,当然在StoryBoard中一步到位更改标题和Item属性也未尝不可。如下图所示。

StoryBoard上更改NavigationBar的Bar Item属性

我们知道,用系统的导航栏,导航栏背景色有微透明色,在小弟所经历的开发中,这些设计、UI们老师给我们找事情做,什么我不要它透明的、我想让字体是这样的、左边的返回按钮能不能我自定义个图片诸如此类,说实话我觉得根本没那个必要跟他们讲道理,因为设计人家才是专业的,为此争执的时间也把他们的需求给做好了(我是不是太随和了)。其实,要想实现他们的需求可以有两种方式:

          1.使用系统的导航栏。

            (1)改变背景色

UIImage *backgroundImage = [self imageWithColor:[UIColor whiteColor]];[self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];

self.navigationController.navigationBar.translucent = NO;

[self.navigationController.navigationBar setTitleTextAttributes:

@{NSFontAttributeName:[UIFont systemFontOfSize:17],

NSForegroundColorAttributeName:[UIColor colorWithRed:1.0 green:75/255.0 blue:90/255.0 alpha:1]}];

//创建纯色背景的方法

-(UIImage *)imageWithColor:(UIColor *)color {

CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

UIGraphicsBeginImageContext(rect.size);

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);

CGContextFillRect(context, rect);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return image;

}

            (2)自定义Bar Button Item (有时候需要增加点击的范围,可以将Button设置的大一点,便于交互)。在自定义Bar Button Item的时候我选择新建一个继承与UIBarButtonItem的类别。

+ (instancetype)itemWithNorImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action

{

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

[btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];

btn.frame = CGRectMake(0, 0, 74, 44);

[btn setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];

[btn sizeToFit];

[btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

UIView *containVew = [[UIView alloc] initWithFrame:btn.bounds];

[containVew addSubview:btn];

return [[UIBarButtonItem alloc]initWithCustomView:containVew];

}

        然后在控制器中调用方法:self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithNorImage:@"left" highImage:@"" target:self action:@selector(back:)];



     2.自定义导航栏。

        自定义导航栏可以纯代码创建View,在View上设置约束,自定义title和返回按钮,如果项目中有特殊需要可以在这个View上创建需要的各个类型的控件,并写成公开方法以供调用或进行隐藏显示等操作。   当然也可以创建一个View的xib文件,在custom class中填写集成与UIView的一个子类view的类名。

自定义NavView


在BaseViewController中的调用方法

在进行创建的StoryBoard的层级图中我们不难发现,大多数的项目中都可以通过创建几个BaseViewController的方式进行层级的继承,根据开发的不同需要继承不同的父类在显示导航栏属性上面做一些可靠的调节,满足日常开发需要。

二、TabBar在demo中将根视图控制器的custom Class 写成TabbarController类名,在代码中定义TabBar的样式,在View中自定义Button,通过代理方法传递点击的是哪个导航控制器。

在TabBarView自定义完成,项目能正常跑动,但是在点击自定义的TabBar的时候会出现以下问题。

点击最后个按钮


系统Tabbar层级关系
自定义的TabBar中按钮的位置

知道问题的所在,定位到出现此类问题的原因:

         为了能同时出现自定义NavigationBar和经过更改系统的NavBar显示不透明的要求,最后一个导航控制器是系统的导航控制器,其他四个导航控制器的头部均为自定义。

        问题出在了我在控制器中设置了self.navigationController.title = @"嘻嘻哈哈";这个设置也牵连到TabBarButton的设置,也就是说系统同时设置了两个地方 ,一个是NavigationController的title另一个就是对应的TabBarButton,也就是说将按钮重新赋值了,掩盖了自定义的tabBarView。

        好吧,既然这样不行,那就换个方法,设置self.title,其实是一样的的效果,因为self.title设置的就是导航控制器的title,FifthTableVC是导航控制器的根控制器。

        难道没有解决问题的方法了吗?答案是否定的,导航控制器和TabBar控制器是两个单独的控制器,导航的标题肯定有对应的设置方法,没错就是self.navigationItem.title这个属性,这个属性只改变导航控制器的导航条上面的控件属性。问题也就迎刃而解。如有不妥的地方,欢迎指正。

demo源码,git下载地址:StoryBoardTest-demo

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

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,467评论 1 14
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,334评论 2 4
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,315评论 2 50
  • 中午有一个用户通过QQ群查找功能,找到我们公司的团队QQ群,并申请加入。加入的原因是他在我们网站上找不到某款商品,...
    爱做梦的孩子阅读 240评论 0 1
  • 第六组曹余心得分享 薛老师分享着她的工作经历,我们时不时地就听到她说...
    曹小鱼_749b阅读 370评论 0 0