关于导航栏重叠的一点记录
2015-09-24 13:36
274 查看
最近应用中出现导航栏重叠的问题,经过仔细试验,发现出现的场景是UIWebView中加入interactivePopGestureRecognizer右滑手势,在右滑UIWebViewController到一半的时候停住,这时候 WebView还在加载,直到其加载完毕再松开手,就会出现重叠的导航栏。
原因分析:排查代码,发现在viewDidLoad的时候设置了一遍self.title=xxx_name;
在webViewDidFinishLoad中,也就是WebView加载完毕又设置了一遍self.title=xxx_name。
目的是进入页面的时候有xxx_name的话就直接设置标题,如果没有xxx_name就需要通过js取到我们所需的标题然后在页面加载完设置。
显然设置两遍title理论上是不会出问题的,事实上正常情况下设置再多遍也没什么问题。关键是第二次设置title的时机,是在右滑倒一半停住的时候,界面上一半是上层viewcontroller,一半是当前viewcontroller,这个时候WebView经历了”加载->加载完毕->设置标题”的过程,猜测是不是这个时候设置的标题不在当前WebView导航栏上?
我好奇点进去self.title看看,发现setTitle:(NSString *)title方法在基类中被修改过:
这里的titleView是临时变量的写法,但是如果是设置同一个viewcontroller的话,每次调用self.navigationItem.titleView = _titleView;也不会有影响啊,那是不是停在一半的时候设置的self.navigationItem.titleView中这个self不是当前的?我先试着试着把setTitle:(NSString *)title方法修改一下:
将titleView这种临时变量写法换成了整个viewcontroller生命周期都存在的对象titleViewLabel,然后再试验了一下,发现问题居然解决了!也没有再复现导航栏标题重叠的问题!这样就可以排除“self.navigationItem.titleView中这个self不是当前的?”这个无厘头的猜想,因为设置标题的代码是在当前这个viewcontroller中的,也没理由是另一个的,其实通过打断点在控制台输出self也可以发现两次self都是当前的webviewcontroller。那么问题就变成了同一个viewcontroller设置两遍navigationItem.titleView出现了 两个titleView,虽然问题解决了,但是没有找到根本原因,头疼。
原因分析:排查代码,发现在viewDidLoad的时候设置了一遍self.title=xxx_name;
- (void)viewDidLoad { [super viewDidLoad]; self.title = xxx_name; }
在webViewDidFinishLoad中,也就是WebView加载完毕又设置了一遍self.title=xxx_name。
- (void)webViewDidFinishLoad:(UIWebView *)webView { [super webViewDidFinishLoad:webView]; NSString xxx_name = [self.webView stringByEvaluatingJavaScriptFromString:@"getTitleName()"]; self.title = xxx_name; }
目的是进入页面的时候有xxx_name的话就直接设置标题,如果没有xxx_name就需要通过js取到我们所需的标题然后在页面加载完设置。
显然设置两遍title理论上是不会出问题的,事实上正常情况下设置再多遍也没什么问题。关键是第二次设置title的时机,是在右滑倒一半停住的时候,界面上一半是上层viewcontroller,一半是当前viewcontroller,这个时候WebView经历了”加载->加载完毕->设置标题”的过程,猜测是不是这个时候设置的标题不在当前WebView导航栏上?
我好奇点进去self.title看看,发现setTitle:(NSString *)title方法在基类中被修改过:
- (void)setTitle:(NSString *)title { [super setTitle:title]; UILabel *_titleView = [[UILabel alloc] init]; _titleView.textColor = [UIColor whiteColor]; _titleView.backgroundColor = [UIColor clearColor]; _titleView.font = [UIFont boldCustomFontOfSize:18.0f]; _titleView.textAlignment = NSTextAlignmentCenter; CGRect frame = _titleView.frame; _titleView.frame = CGRectMake(frame.origin.x, 5, frame.size.width, 34); self.navigationItem.titleView = _titleView; _titleView.text = title; }
这里的titleView是临时变量的写法,但是如果是设置同一个viewcontroller的话,每次调用self.navigationItem.titleView = _titleView;也不会有影响啊,那是不是停在一半的时候设置的self.navigationItem.titleView中这个self不是当前的?我先试着试着把setTitle:(NSString *)title方法修改一下:
- (void)setTitle:(NSString *)title { [super setTitle:title]; CGRect frame = self.titleViewLabel.frame; _titleViewLabel.frame = CGRectMake(frame.origin.x, 5, frame.size.width, 34); self.navigationItem.titleView = _titleViewLabel; _titleViewLabel.text = title; } - (UILabel *)titleViewLabel { if (!_titleViewLabel) { _titleViewLabel = [[UILabel alloc] init]; _titleViewLabel.textColor = [UIColor whiteColor]; _titleViewLabel.backgroundColor = [UIColor clearColor]; _titleViewLabel.font = [UIFont boldSystemFontOfSize:18.0f]; _titleViewLabel.textAlignment = NSTextAlignmentCenter; } return _titleViewLabel; }
将titleView这种临时变量写法换成了整个viewcontroller生命周期都存在的对象titleViewLabel,然后再试验了一下,发现问题居然解决了!也没有再复现导航栏标题重叠的问题!这样就可以排除“self.navigationItem.titleView中这个self不是当前的?”这个无厘头的猜想,因为设置标题的代码是在当前这个viewcontroller中的,也没理由是另一个的,其实通过打断点在控制台输出self也可以发现两次self都是当前的webviewcontroller。那么问题就变成了同一个viewcontroller设置两遍navigationItem.titleView出现了 两个titleView,虽然问题解决了,但是没有找到根本原因,头疼。
相关文章推荐
- 《(数学篇)》 复数运算
- 无名管道
- 图像处理的常用方法
- windos安装laravel
- Configuring the Java Virtual Manager (JVM)
- 学生信息管理后台(python+django+sql)
- iOS8 真机调试流程和iOS9免证书调试(一)
- HashMap
- adroid复选框checkbox的使用
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程(转载)
- CSS中position属性介绍(新增sticky)
- iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)
- 黑马程序员-包装类与数字处理类
- Android 屏幕适配
- HTC M兼容版测试小结
- jquery text() - 设置或返回所选元素的文本内容 进行判断值注意
- 好用的PERL正则表达式在线测试工具
- 宝宝生病
- Java学习笔记【用户自定义类基本知识点】
- 解决CUDA程序的黑屏恢复问题