如何自定义navigationbar 背景色的高度

如何完全自定义NavigationBar_百度知道
如何完全自定义NavigationBar
提问者采纳
strong)&nbsp,&class]&}在拥有navigationBar&(^didTapNewThemeTopBlock)(void);*tipsNewThemeB&&nbsp,而这个NavigationBar的内部内容则是比较复杂的了;UIButton&*)navigationB}&(^didTapScrollToTopBlock)(void);@optional-&&}这样的话就将HomeNavigationController的导航栏的样式进行了确定了;&UIButton&nbsp,lable的隐藏等等的点击相应等等);而里面使用的这个的控制器中对具体的block进行处理navigationB&[super&nbsp,里面添加我们需要的所有的navigationBar 的样式;private-(void)(^didTapComposeBlock)(void);copy)&nbsp:[Navigationbar&void&&nbsp,而一种比较直观的方式就是;((self)&nbsp,然后再进行内部view的构建就可以了;(^didTapNotificationsBlock)(void);&nbsp,&nbsp,&nbsp,所以常常需要进行自定义操作;@property(&copy)&&@property(&nbsp:&(^didTapChatBlock)(void),最好使用一些动画;@property(copy)&(nonatomic,&@property&&nbsp,这里提供其中一个自定义view的h定义方式@interface&void&nbsp,&nbsp,&nbsp,前面的文中有提供动画流畅的保证方式,或者按钮的消失;&nbsp。而为了能进行子控制器的导航栏的正确显示,例子是#pragma&nbsp如何完全自定义NavigationBarNavigationBar是很常用的一个元素;copy)&nbsp,&NSObject&&void&&&&nbsp,而且使得这些view的尺寸都是整个NavigationBar的尺寸,而NavigationBar中的多个view的左右按钮以及中间都可以完全的自定义了;strong)&&(_didTapNotificationsBlock)&@end而在m文件中只要对按钮添加监听就可以了;:(id)sender{&&=&&return&nbsp,&copy)&_didTapNotificationsBlock();^{&=&initWithNavigationBarC@property&nbsp,最好在HomeNavigationController中声明一个@protocol&&&@property&nbsp,而需要进行切换的时候就进行这些view之间的显示和隐藏的切换就可以了;&strong)&&nbsp:nil];UIView@property(self.didTapNotificationsBlock&(void)willPresentWithNavigationB&@property(titleLSecretPresentableViewController&nbsp,并且在这个类的实现中这样操作@implementation&{&nbsp.homeNavigationV(nonatomic:方法则正是这个控制器中的具体的处理方法(*unreadLeftV,而事件 的传递则使用block的方式,但同时也可以完全实现系统提供bar的所有功能等等;[self&&&nbsp,现在新建一个HomeNavigationController 继承自 UINavigationCUILabel*&&&&&@end而那些想要拥有这个导航栏的自控制器只需要实现协议就可以了;&nbsp。更加方便的进行自定义的操作:(Navigationbar&nbsp.delegate&nbsp,先定义一个类NavigationBar继承自 UINavigationBtoolbarC&&lt,这样的话就实现了自定义bar的同时而且实现了bar和控制器之间的无缝衔接,&};void&&nbsp:nil],因为apple很推荐我们使用block而这种bar和viewcontrol的传递消息的方式感觉这是最优秀的了;=&&if&if&&void&nbsp,而这个具体的实现过程很有可能就是apple自己内部的实现方式;&&self&HomeNavigationController-(instancetype)init{&HomeNavigationView&&nbsp
来自团队:
其他类似问题
为您推荐:
自定义的相关知识
下载知道APP
随时随地咨询
出门在外也不愁如何自定义NavigationBar的高度_百度知道
如何自定义NavigationBar的高度
我有更好的答案
如果你用了NavigationController,这个bar的高度在坚屏为44的高,是改变不了的
其他类似问题
为您推荐:
下载知道APP
随时随地咨询
出门在外也不愁如何自定义NavigationBar的高度 - 推酷
如何自定义NavigationBar的高度
UINavigationBar的高度在苹果官方的SDK中是固定的44个点,但是实际项目中我们却有可能遇到这样的情况,如下图:
这样的一个UINavigationBar的高度达到了84个点,这就需要我们自定义系统自带的UINavigationBar的高度,但是系统并没有直截了当的方法来调整这个NavigationBar的Height,于是我进行了以下的尝试。
在需要进行调整的那个ViewController类的ViewWillApplear这个方法对self.navigationController.navigationBar的frame进行赋值,其中frame.size.height变为我们需要的新高度(本例中为84),然后在ViewWillDisappear这个方法中将frame再改回去就可以了。
注:这里将代码写在ViewWillAppear/DisAppear里面的原因是根据这个自定义高度UINavigationBar只在某一个界面出现,如果你所有的UINavigationBar的高度是统一的,那么就没必要这么写,只需要写在第一次出现的ViewController的ViewDidLoad消息里面就可以了。
代码如下:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
CGRect rect = self.navigationController.navigationBar.
self.navigationController.navigationBar.frame = CGRectMake(rect.origin.x,rect.origin.y,rect.size.width,84);
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
CGRect rect = self.navigationController.navigationBar.
self.navigationController.navigationBar.frame = CGRectMake(rect.origin.x,rect.origin.y,rect.size.width,44);
viewWillAppear
viewWillAppear
navigationController
navigationBar
navigationController
navigationBar
CGRectMake
viewWillDisappear
viewWillDisappear
navigationController
navigationBar
navigationController
navigationBar
CGRectMake
OK,运行!UINavigationBar的高度正确地发生变化,事情就这么愉快地解决了!等等,导航栏上的标题和返回按钮的位置却都贴到最下面了,如下图:
为什么会是这样?发生了什么?我也不知道!但是现在很明显就是需要我们去调整这两个“UIView”的frame,把他们向上移动40个点,为之后要添加的其他控件留出空间。很简单,对吧?
然后,数个小时过去后……
我靠,这些货特么根本不是UIView嘛!
返回按钮是UIBarButtonItem,继承自UIBarItem,UIBarItem继承自NSObject,标题这个就更悲剧了,如果你默认使用ViewController的title属性做为标题(本例就是),那么self.navigationItem.titleView这个值为nil,更改nil的frame什么事情也不会发生。
这期间我试过各种非正常手段去找到他们,包括遍历UINavigationBar的view hierarchy(视图层级),试图使用UIBarButtonItem的私有变量,尝试修改UIBarButtonItem的CustomView.frame等……都无功而返。
然后开始上Google搜索,StackOverflow一片找,SO上果然大神云集,问题的解答也相当高大上。
答案基本上有2种:
1、不用系统的NavigationBar啦,咱们自定义一个就好啦,然后重载layoutSubView里面的怎样怎样云云。
2、这个简单,我写了个NavigationBar的分类(Category),里面加个什么消息xxx。
小菜我一看到自定义控件神马的立即就給外国大爷们跪了,Category什么的更是从来没用过……其实我只需要更改一下这两个控件的高度而已,用不用这么暴力?
于是我开始查文档,终于被我找到下面这两个消息:
UINavigationBar下:
- (void)setTitleVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics
官方描述:
Sets the title’s vertical position adjustment for given bar metrics.
调整某个BarMetrics(这个不知道怎么翻译)下标题的垂直位置。
UIBarButtonItem下:
- (void)setBackgroundVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics
官方描述:
Sets the background vertical position offset for given bar metrics.This offset is used to adjust the vertical centering of bordered bar buttons within the bar. 调整某个BarMetrics(这个不知道怎么翻译)下背景的垂直位置的偏差值,这个偏差值用来调整该圆角按钮的垂直中心在Bar内的位置。
OhMyGod,终于找到组织了!赶紧试一下,还是刚才的ViewController,在ViewWillAppear这个消息中再加上这么两句:
[self.navigationController.navigationBar setTitleVerticalPositionAdjustment:-40.0 forBarMetrics:UIBarMetricsDefault];
[self.navigationItem.leftBarButtonItem setBackgroundVerticalPositionAdjustment:-40.0 forBarMetrics:UIBarMetricsDefault];
<div data-line="crayon-530e6f
<div data-line="crayon-530e6f
navigationController
navigationBar
setTitleVerticalPositionAdjustment
forBarMetrics
UIBarMetricsDefault
navigationItem
leftBarButtonItem
setBackgroundVerticalPositionAdjustment
forBarMetrics
UIBarMetricsDefault
注:这里使用leftBarButtonItem是因为我使用了自定义图片的返回按钮,这时leftBarButton就替代了backBarButton。
不要忘了在ViewWillDisappear的时候再把标题的位置调整回来,不然当标题就会跳到屏幕的最上方了;另一方面,返回按钮却不用设置了,这两行代码的作用机制不一样,返回按钮只和当前的ViewController有关:
[self.navigationController.navigationBar setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault];
<div data-line="crayon-530e6f
navigationController
navigationBar
setTitleVerticalPositionAdjustment
forBarMetrics
UIBarMetricsDefault
运行结果:
太棒啦!终于成功了!标题和返回按钮的垂直位置按照我们设置的向上移动了40个点!
后面的事情就简单了,按照设计湿GG或者设计师MM的要求把相应的UI控件加到self.navigationController.navigationBar中,收工!
注:上述运行结果的前提是使用自定义图片的leftBarButtonItem作为返回按钮替代系统默认的backBarButtonItem,并且你的leftBarButtonItem是使用 initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action这个方法创建的(原因我后面会讲)。换句话说,在你的ViewController或者它的父类的ViewDidLoad方法里,应该有类似下面的两行代码:
UIBarButtonItem * item =[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@“这里是你的某个图片名&] style:UIBarButtonItemStyleBordered target:self
action:@selector(你的某个方法名)];
self.navigationItem.leftBarButtonItem =
<div data-line="crayon-530e6f
<div data-line="crayon-530e6f
UIBarButtonItem *
UIBarButtonItem
initWithImage
imageNamed
“这里是你的某个图片名&
UIBarButtonItemStyleBordered
你的某个方法名
navigationItem
leftBarButtonItem
如果你的需求刚好能用这个方法解决,那么恭喜你,因为小菜能拿出的干货就只有这么多了,后面的就全是困惑了……orz
做为一个iOS Level1的菜鸟,在费了好大的劲终于找到问题的解决方法之后,欣喜是肯定的,想得瑟一下是必然的,于是飘飘乎就想把相关的方法研究研究,搞个通用的解决方案出来。于是,噩梦开始了……
N多个小时过去了,毛个解决方案没搞出来,却搞出来了很多个问题……
问题1:系统默认的导航栏返回按钮垂直位置无法调节。
当返回按钮使用系统默认的backBarButtonItem的时候,使用UIBarButtonItem的- (void)setBackButtonBackgroundVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics来调整它的垂直位置,不起作用。
我进行了各种尝试,但是backBarButtonItem一直是nil,文档上说它会根据上一个ViewController的title属性来创建这个按钮,但是我找不到这个时机来调整执行上面这个消息。更准确的问题可能是,下图中的这个消息到底应该怎么用才能看到效果呢?
问题2:自定义的返回按钮在导航栏中的垂直位置仅在某一种情况下可以调节。
后来我又发现,即使不用系统默认地返回按钮,使用自定义的leftBarButtonItem,也只在使用 initWithImage:style target:action:这个方法创建的UIBarButtonItem时生效,使用其他init方法情况一律无效。至于什么原因不明觉厉。
这两个问题我百撕不得姐,求大家指教,提前说声谢谢!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致下次自动登录
现在的位置:
& 综合 & 正文
如何修改UINavigationBar的高度
新建一个UINavigationBar的Category,如下:
@implementation UINavigationBar (CustomHeight)
- (CGSize)sizeThatFits:(CGSize)size {
// Change navigation bar height. The height must be even, otherwise there will be a white line above the navigation bar.
CGSize newSize = CGSizeMake(self.frame.size.width, 74);
return newS
-(void)layoutSubviews {
[super layoutSubviews];
CGRect barFrame = self.
barFrame.size.height = 74;
self.frame = barF
// Make items on navigation bar vertically centered.
int i = 0;
for (UIView *view in self.subviews) {
if (i == 0)
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.
center.y = centerY;
view.center =
注意:如果只重载sizeThatFits函数,则可能出现UINavigationBar宽度不正确的现象,因为在这时获得的frame可能不正确。
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 navigationbar 背景色 的文章

 

随机推荐