您的位置:首页 > 其它

关于导航栏重叠的一点记录

2015-09-24 13:36 274 查看
最近应用中出现导航栏重叠的问题,经过仔细试验,发现出现的场景是UIWebView中加入interactivePopGestureRecognizer右滑手势,在右滑UIWebViewController到一半的时候停住,这时候 WebView还在加载,直到其加载完毕再松开手,就会出现重叠的导航栏。

原因分析:排查代码,发现在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,虽然问题解决了,但是没有找到根本原因,头疼。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  导航栏重叠