NavigationBar的内部结构

在iOS开发中,对导航栏的操作最多的是让导航栏在透明与不同明之间切换,本文着重介绍导航栏的内部结构,通过学习这篇文章,大部分关于导航栏的问题将迎刃而解.

1.UINavigationBar的结构

UINavigationBar 继承 UIView, 它内部有两个子控件,分别是:_UINavigationBarBackground :UIImageView和 _UINavigationBarBackIndicatorView :UIImageView (在没有左右导航按钮情况下,任何新加入控件都是插入这两个控件之间的).



从图中可以看出,_UINavigationBarBackIndicatorView就是返回箭头, 是一张图片.它没有其他子控件.

下面就详细分析UINavigationBarBackground,其内部有两个子控件,分别是:_UIBackdropView 和 UIImageView, 其中UIImageView就是我们看到的导航栏下边的那一条灰灰的下线.



从图中可以看出,UIImageView就是那一条细线,没有子控件.

下面详细分析_UIBackdropView, 其内部至少有两个控件_UIBackdropEffectView 和 UIView. _UIBackdropEffectView主要的作用是实现模糊效果.



下面来看一下_UIBackdropEffectView的效果



删除_UIBackdropEffectView后:


实现导航栏只需一句代码

<span style="font-size:18px;">- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationController.navigationBar.subviews[0].alpha = 0.5;
    
}</span>

效果:



最后,将navigationBar内部的所有控件输出,可以详细观察其内部子控件的属性设置

代码:

    NSArray *array = self.navigationController.navigationBar.subviews;
    NSLog(@"array=%@",array);
    
    UIImageView *img1 = array[0];
    UIImageView *img2 = array[1];
    NSLog(@"img1Array=%@,img2=%@",img1.subviews, img2);
    
    NSArray *array2 = img1.subviews;
    UIView *dropView = array2[0];
    NSLog(@"dropview=%@",dropView.subviews);

运行结果:

2016-08-09 12:03:45.096 NavigationTest[1138:77093] array=(

    "<_UINavigationBarBackground: 0x7ff3e346d7e0; frame = (0 -20; 320 64); opaque = NO; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7ff3e3460a00>>",

    "<_UINavigationBarBackIndicatorView: 0x7ff3e35f1ae0; frame = (0 11.5; 13 21); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7ff3e353cb50>>"

)



2016-08-09 12:03:45.097 NavigationTest[1138:77093] img1Array=(

    "<_UIBackdropView: 0x7ff3e35fa270; frame = (0 0; 320 64); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <_UIBackdropViewLayer: 0x7ff3e36025c0>>",

    "<UIImageView: 0x7ff3e346e000; frame = (0 64; 320 0.5); userInteractionEnabled = NO; layer = <CALayer: 0x7ff3e346e3e0>>"

),

img2=<_UINavigationBarBackIndicatorView: 0x7ff3e35f1ae0; frame = (0 11.5; 13 21); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7ff3e353cb50>>



2016-08-09 12:03:45.098 NavigationTest[1138:77093] dropview=(

    "<_UIBackdropEffectView: 0x7ff3e3601c20; frame = (0 0; 320 64); clipsToBounds = YES; opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CABackdropLayer: 0x7ff3e350d260>>",

    "<UIView: 0x7ff3e35f1e00; frame = (0 0; 320 64); hidden = YES; opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x7ff3e35e7ea0>>"

)







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值