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

最近应用中出现导航栏重叠的问题,经过仔细试验,发现出现的场景是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,虽然问题解决了,但是没有找到根本原因,头疼。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值