自定义UINavgationBar的高度
来源:互联网 发布:wifi满信号网络特别慢 编辑:程序博客网 时间:2024/06/05 01:16
UINavigationBar 官方给出的高度是44,一般开发过程中,我们都是使用默认的高度。但是有些需求,让我们不得不想办法去修改导航栏的高度,比如下面的场景
这个导航栏的高度达到了84,使用默认的是没有办法完成的,所以我们需要尝试修改UINavigationBar,来完成这个需求。
我们只需要关心高度增加了多少,这里我们首先定义一个变量来表示增加的高度
const CGFloat NavigationBarHeightIncrease = 40.f;
通过重写 - (CGSize)sizeThatFits:(CGSize)size 这个方法,来修改UINavigationBar的高度,代码如下:
- (CGSize)sizeThatFits:(CGSize)size{ CGSize navigationBarSize = [super sizeThatFits:size]; navigationBarSize.height += NavigationBarHeightIncrease; return navigationBarSize;}
这个时候尝试运行 看一下效果,如下:
我们会发现高度确实是改变了,但是上面的item和title的位置不是我们想要的,所以接下来需要考虑如何修改他们的位置。
我们先在layoutSubviews函数里打印一下所有的subView,看一下层级
<_UINavigationBarBackground: 0x7fa158e69da0; frame = (0 -20; 320 104); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fa158e69f20>><UIButton: 0x7fa158d4bc60; frame = (269 44; 35 35); opaque = NO; animations = { opacity=<CABasicAnimation: 0x7fa158d6f350>; }; layer = <CALayer: 0x7fa158d6c2d0>><UIButton: 0x7fa158d4f970; frame = (16 47; 30 30); opaque = NO; animations = { opacity=<CABasicAnimation: 0x7fa158d6f2d0>; }; layer = <CALayer: 0x7fa158d3a9c0>><UIView: 0x7fa158d6e1b0; frame = (0 0; 269 84); clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x7fa158d6d170>><UIView: 0x7fa158d6b1d0; frame = (46 0; 274 84); clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x7fa158d47120>>_UINavigationBarBackIndicatorView: 0x7fa158e6aec0; frame = (8 51.5; 13 21); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7fa158e6ab20>><UINavigationItemView: 0x1090a4f40; frame = (136.5 8; 47 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x10909a0f0>>| <UILabel: 0x1090a5440; frame = (0 41; 47 22); text = 'Home'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x10909a660>>
这里的左右两个按钮 分别对应两个UIButton 类, 中间的title对应UINavigationItemView类,我想的是,能不能去改变他们的frame,达到修改位置的目的,于是,代码如下:
- (void)layoutSubviews { [super layoutSubviews]; NSArray *classNamesToReposition = @[@"UINavigationItemView", @"UINavigationButton",@"UIButton"]; for (UIView *view in self.subviews) { if ([classNamesToReposition containsObject:NSStringFromClass([view class])]) { CGRect frame = view.frame; frame.origin.y -= NavigationBarHeightIncrease; view.frame=frame; } }}
运行后,结果如下:
title的位置并没有改变,后来查看了资料后,发现可以通过这种方法可以修改title的位置
[self setTitleVerticalPositionAdjustment:-NavigationBarHeightIncrease forBarMetrics:UIBarMetricsDefault];
效果如下
看起来似乎达到了我们想要的效果,正当我要欣喜若狂的时候,发现跳转的时候,位置还是回到了原来的地方,并且跳转的时候,能明显感觉到frame的变化,这种方法还是不可取。
下面我们来换种思路,可以将整个UINavigationBar的transform,在初始化的时候,整体做一个位移处理,代码如下:
- (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self initialize]; } return self;}- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initialize]; } return self;}- (void)initialize { [self setTransform:CGAffineTransformMakeTranslation(0, -(NavigationBarHeightIncrease))];}
运行后发现效果如图:
位置的问题是解决了,但是高度又看起来和刚开始一样了,其实这里我们就需要修改UINavigationBar最下面的View的frame 就可以了,具体代码如下:
- (void)layoutSubviews{ [super layoutSubviews];//这里底层的View iOS 9.0以上好像是_UIBarBackground 类 以下是_UINavigationBarBackground ,所以需要判断两个 NSArray *classNamesToReposition = @[@"_UIBarBackground",@"_UINavigationBarBackground"]; for (UIView *view in [self subviews]) { if ([classNamesToReposition containsObject:NSStringFromClass([view class])]) { CGRect bounds = [self bounds]; CGRect frame = [view frame]; frame.origin.y = bounds.origin.y + NavigationBarHeightIncrease - 20.f; frame.size.height = bounds.size.height + 20.f; [view setFrame:frame]; } }}
效果如下:
至此 ,已经完美的实现了UINavigationBar高度变化,但是两边的按钮和title不受影响
- 自定义UINavgationBar的高度
- 再次思考UINavgationBar的自定义问题
- iphone--自定义UINavgationBar
- 自定义pickview的高度
- 自定义pickview的高度
- 自定义navigationBar的高度
- 自定义UIAlertView的高度
- 自定义cell的高度
- 自定义pickview的高度
- 自定义cell的高度
- 自定义ViewPager的高度
- 自定义ListView的高度
- 自定义View的高度
- 自定义Label的高度
- iOS 自定义cell的高度
- 如何自定义NavigationBar的高度
- 如何自定义NavigationBar的高度
- 如何自定义NavigationBar的高度
- 卷积神经网络池化层和卷积层作用
- c++关键字
- 无监督学习与GAN网络
- WebSocket 是什么原理?为什么可以实现持久连接
- Java复习之字符串流
- 自定义UINavgationBar的高度
- Rancher 容器实战分享季之杭州站精彩回顾
- 初学python:边学边练,定义函数
- C语言基础进阶之 MessageBox()用法简介
- 优先队列
- RestTemplate中使用ParameterizedTypeReference参数化类型支持泛型,主要是List
- Hadoop实战(五) 高阶MapReduce
- Linux系统用户管理
- IntelliJ IDEA启动Tomcat后,却无法访问Tomcat主页