有关导航栏的一些研究

今天在解决问题时,突然发现自己对navigationbar不甚了解,在看了风往北吹的这篇iOS 自定义导航栏笔记之后,决定跟随作者的笔记亲自实践一下,so,就有了一下的内容.

1. 隐藏导航栏的方法

两种方法皆可

    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [self.navigationController.navigationBar setHidden:YES];

通过属性直接设置之所以能成功,是因为虽然navigationBar是readonly,但是hidden是默认的(readwrite)。建议使用第一个,通过发送消息来设置----风往北吹

2.关于自定义导航栏背景的一些发现.

  • 方案1:通过代理来设置
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];

PS:这个方法确实可以起到改变导航栏颜色的作用,但是我发现只在特定的地方调用这个方法才会起作用:
1.在Appledelegate.m中的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

方法中调用;
2.在自定义的CustomNavigationController(继承自UINavigationController)中调用.

  • 方案2.直接通过设置navigationBar的相关属性来实现
self.navigationController.navigationBar.barTintColor = [UIColor redColor];

先观察一下图层关系:


有关导航栏的一些研究_第1张图片
未设置barTintColor.png
有关导航栏的一些研究_第2张图片
设置barTintColor.png

PS:此处引用风往北吹的一段话:

UINavgationBar结构图说明:
1.从图中的对照关系可以看到,UINavigationBar包含一个:UINavigationBarBackground控件(已经延伸到边界,覆盖掉了导航栏),另一个UINavigationBarBackIndicatorView(其实就是那个蓝色的返回按钮,当push进来一个ViewController才会显示)
2.UINavigationBarBackground控件里面包含:UIBackdropView(UIBackdropEffectView带有高斯模糊效果的视图),UIImageView(导航栏下方的阴影分割线)

通过观察设置barTintColor前后的图层发现,无论上面的那种方法,只要设置了navigationBar的barTintColor属性,在UIBackdropView上面都会多出两个view其中一个view的颜色正是我们所设置的barTint的color颜色.

  • 方案3.通过设置navgationBar.backgroundColor 来改变背景色.
    具体的设置方法,在风往北吹的文章中说的很清楚了.
    我只是补充一些内容
    使用这个方法来修改
    navgationBar
    的背景色的时候最好和下面这个方法搭配使用
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.backgroundColor = [UIColor redColor];

至于BackgroundImage:这个参数的规格,我们接下来讨论.

  1. BackgroundImage:一个空的图片对象
有关导航栏的一些研究_第3张图片
设置bar的BackgroundImage为空图.png

观察图层发现navigationBar的UINavigationBarBackground上没有了UIBackdropView这个图层,只有一个image(shadowline).此时导航栏是透明的.

  1. BackgroundImage:一个特定高度的图片对象


    有关导航栏的一些研究_第4张图片
    设置bar的BackgroundImage为高度为44的图片.png

    当图片的导读恰好是44的时候,图层如上图,状态栏会变成黑色.UINavigationBarBackground上多了UIBarBackgroundTopCurtainView和UIBarBackgroundCustomImageCurtainView

  2. BackgroundImage:一个高度>64的图片对象


    有关导航栏的一些研究_第5张图片
    设置bar的BackgroundImage为高度为>64的图片.png

    此时,UINavigationBarBackground就从一个透明的图片变为了我们所设置的那张图片.(至于图片是否被压缩,需要大家亲自试一下)
    4.BackgroundImage:一个高度<44的图片对象


    有关导航栏的一些研究_第6张图片
    设置bar的BackgroundImage为高度<44的图片.png

    此时,UINavigationBarBackground就从一个透明的图片变为了我们所设置的那张图片.(图片是通过平铺的方式从上到下铺满64个高度的.)

在测试过程中还发现,如果设置了BackgroundImage:,则barTintColor的设置将会无效,同时设置BackgroundImage:时,BarMetrics:的值只有是UIBarMetricsDefault时图片设置非空对象(此指不是[UIImage new])的时候,图片才能正常的显示出来.至于为什么还请大神指点一下.谢谢.

你可能感兴趣的:(有关导航栏的一些研究)