关于navigationBar影响view的frame问题

来源:互联网 发布:淘宝粉哥香水是正品吗 编辑:程序博客网 时间:2024/05/09 11:52

关于navigationBar影响view的frame问题

本文主要介绍自己在项目开发中遇到的一个小问题, 主要是对于navigationBar的设置, 会影响viewController的view的frame的问题, 没遇到过的小伙伴也许不太理解, 接下来就主要讲解一下出现问题的地方.

问题主要来源于我们使用navigationController的时候, 会去设置navigationBar的translucent属性, 如果当前controller的translucent属性值和push出来的viewController的值不一致, 那么, 我们在back返回上一个viewController的时候, 会出现意外的问题?

先来看看效果图吧:

这个是push之前的界面, 我手动添加了一个红色的view, 当前navigationBar的translucent为YES.
即:
self.navigationController.navigationBar.translucent = YES;
这里写图片描述

以下是push界面后, 然后返回的效果.
push出的界面navigationBar的translucent为NO.
即:
self.navigationController.navigationBar.translucent = NO;
这里写图片描述

当返回后我们发现了一个很奇怪的问题, 那就是我们添加的view的位置发生了变化, 这就是我说的问题所在, 自己以前也没遇到过这样的问题, 首先是怎么查找这个问题, 大致可以分为以下两个方向:

1.检测子view的frame有没有变化

2.检测父view的frame有没有变化

至于检测的方法,可以使用KVO检测frame的变化, 或者使用log打印frame的值比较前后的变化, 大家可以选择合适的方法查找问题.

我这里主要介绍我打印父view的frame发现的问题:

主要是利用可viewController的生命周期来检测:

#pragma mark - override- (void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    NSLog(@"%s--%@", __FUNCTION__, NSStringFromCGRect(self.view.frame));}- (void)viewDidAppear:(BOOL)animated{    [super viewDidAppear:animated];    NSLog(@"%s--%@", __FUNCTION__, NSStringFromCGRect(self.view.frame));}- (void)viewWillDisappear:(BOOL)animated{    [super viewWillDisappear:animated];    NSLog(@"%s--%@", __FUNCTION__, NSStringFromCGRect(self.view.frame));}- (void)viewDidDisappear:(BOOL)animated{    [super viewDidDisappear:animated];    NSLog(@"%s--%@", __FUNCTION__, NSStringFromCGRect(self.view.frame));}

大概就使用了以上几个方法, 接下来看看打印的结果吧:

首先是当前viewController加载完成后:

ViewFrameTest[1464:229442] -[ViewController viewWillAppear:]--{{0, 0}, {414, 736}}2016-06-19 21:37:36.316 ViewFrameTest[1464:229442] -[ViewController viewDidAppear:]--{{0, 0}, {414, 736}}

然后push之后:

2016-06-19 21:39:41.232 ViewFrameTest[1464:229442] -[ViewController viewWillDisappear:]--{{0, 0}, {414, 736}}2016-06-19 21:39:41.738 ViewFrameTest[1464:229442] -[ViewController viewDidDisappear:]--{{0, 0}, {414, 736}}

到这里还是没有变化, 然后是back回来之后:

2016-06-19 21:40:56.500 ViewFrameTest[1464:229442] -[ViewController viewWillAppear:]--{{0, 0}, {414, 736}}2016-06-19 21:40:57.003 ViewFrameTest[1464:229442] -[ViewController viewDidAppear:]--{{0, 64}, {414, 672}}

到这里我们就可以发现view的frame发生了变化, 其实看到变化的结果也是可以理解的, 因为我们设置了navigationBar的translucent属性, 导致view的frame发生变化, 这个可能跟translucent本身有关系,因为这个属性值是用来设置navigationBar的样式, 也就是透明或不透明.

至于更详细的问题, 大家可以深入研究, 这里还要说明一个问题, 那就是为什么frame会变化, 而且是在viewWillAppear和viewDidAppear之间发生变化, 本人在stackoverflow上找到了合理的解释:

View frame changes between viewWillAppear: and viewDidAppear:

大家可以查看具体的解释, 说到这里, 希望大家可以真正理解我遇到的问题, 也希望在使用navigationBar的时候多加注意, 避免出现意想不到的问题, 也希望对遇到类似问题的同学有帮助.

0 0
原创粉丝点击