美文网首页ios 程序猿FamilyiOS 技术文档收录
iOS10 title和leftBarButtonItem不显示

iOS10 title和leftBarButtonItem不显示

作者: hnxyzhw | 来源:发表于2016-09-19 09:33 被阅读4851次

    之前自定义了navigationBar的背景颜色,升级到iOS10后,发现title,跟leftBarButtonItem不显示。
    iOS9 之前的navigationBar的背景是_UINavigationBarBackground,到iOS变成了_UIBarBackground,可以通过xcode查看一下相应的布局。我的解决办法是,分别判断iOS10,iOS9的版本,找到对应的背景图,将起隐藏掉,可以消除分割线。然后重新创建一个视图层,颜色可以自定义,需要注意在添加视图或者更新视图时要放到主线程里,同时这个方法需要在viewWillAppear里调用。

    #define isIOS9 ([[UIDevice currentDevice].systemVersion intValue]>=9?YES:NO)
    #define isIOS10 ([[UIDevice currentDevice].systemVersion intValue]>=10?YES:NO)
    
    #pragma mark - 动态修改状态栏跟顶部导航栏的颜色
    -(void)changeNavigationBarBackgroundColor:(UIColor *)barBackgroundColor{
        if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]){
            NSArray *subviews =self.navigationController.navigationBar.subviews;
            for (id viewObj in subviews) {
                if (isIOS10) {
                    //iOS10,改变了状态栏的类为_UIBarBackground
                    NSString *classStr = [NSString stringWithUTF8String:object_getClassName(viewObj)];
                    if ([classStr isEqualToString:@"_UIBarBackground"]) {
                        UIImageView *imageView=(UIImageView *)viewObj;
                        imageView.hidden=YES;
                    }
                }else{
                    //iOS9以及iOS9之前使用的是_UINavigationBarBackground
                    NSString *classStr = [NSString stringWithUTF8String:object_getClassName(viewObj)];
                    if ([classStr isEqualToString:@"_UINavigationBarBackground"]) {
                        UIImageView *imageView=(UIImageView *)viewObj;
                        imageView.hidden=YES;
                    }
                }
            }
            UIImageView *imageView = [self.navigationController.navigationBar viewWithTag:111];
            if (!imageView) {
                imageView=[[UIImageView alloc] initWithFrame:CGRectMake(0, -20, self.view.width, 64)];
                imageView.tag = 111;
                [imageView setBackgroundColor:barBackgroundColor];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self.navigationController.navigationBar insertSubview:imageView atIndex:0];
                });
            }else{
                [imageView setBackgroundColor:barBackgroundColor];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self.navigationController.navigationBar sendSubviewToBack:imageView];
                });
                
            }
            
        }
    }
    

    相关文章

      网友评论

      • 被风吹乱的思念:您好,leftBarButtonItem不显示好像不能解决啊
        被风吹乱的思念:@hnxyzhw 谢谢哈
        被风吹乱的思念:是ios10.3.3的,不过解决了,自定义barButtonItem的按钮没有给出大小导致,不过在别的系统上没有这种情况
        hnxyzhw:@被风吹傻的娇娇 是iOS10的系统么?
      • 烽火七月:只要加2行代码就行了:在viewWillAppear里。(很神奇是不是)
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        [self.navigationController setNavigationBarHidden:NO animated:NO];
        pFruHMXB:我这里不起作用!
        沐浴汐:会有白色的闪屏 不知道你们有没有这效果
        Hunter琼:你这中界面太过生硬
      • iBlocker:NavigationBar上面还是会有一个UIView和一个UIImageVIew会遮盖住title,我把他们抽出来改成透明色就好了
        iBlocker:@hnxyzhw 是在viewWillAppear中调用的,只是原本在viewDidLoad中的布局没动
        hnxyzhw:@不甘将就 你在viewWillAppear里调用的么?我现在是在每一个VC控制器里的viewWillAppear里都调用这个方法,这样就可从新布局视图。如果不从新布局的,再push放下个页面的时候,还会还原成系统默认的布局,就会遮盖title

      本文标题:iOS10 title和leftBarButtonItem不显示

      本文链接:https://www.haomeiwen.com/subject/kongettx.html