在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>>"
)