[iOS10]Xcode8系统导航适配

开发环境

Xcode 8
iOS 10

Xcode 7.3
iOS9.3

问题

最近有个朋友问我,在适配iOS10的时候,导航的图片不显示了,使用的是系统导航,怎么调整都不显示.
在Xcode7.3,iOS9.3显示如下:

Xcode7.3-iOS9.3正常情况下

导航中间位置有一个LOGO视图(当然不是这个条形码),而在Xcode8-iOS10上,这个视图不显示了,如下:

iOS10视图不见了

我看了他添加视图的代码,如下:

-(void)setNavigationBarBackgroundView:(UIView *)backgroundView
{
    NSArray * subs  =[self.navigationBar subviews];
    UIView  * bgview=nil;
    
    for (UIView  * v in subs)
    {
        NSString * classname = NSStringFromClass([v class]);
        if ([classname isEqualToString:@"_UINavigationBarBackground"] || [classname isEqualToString:@"UINavigationBarBackground"])
        {
            bgview=v;
            break;
        }
    }

    if (bgview!=nil)
    {
        int systemVersion =[[UIDevice currentDevice].systemVersion intValue];
        UIView * container=[bgview viewWithTag:20001];
        if (!container)
        {
            CGRect r;
            if (systemVersion>=7)
            {
                r=CGRectMake(0, 0, bgview.frame.size.width, 64);
            }else{
                r=CGRectMake(0, 0, bgview.frame.size.width, 44);
            }
            container = [[UIView alloc] initWithFrame:r];
            [container setBackgroundColor:[UIColor whiteColor]];
            [container setTag:20001];
            [bgview addSubview:container];
            [container release];
        }
        
        [bgview setUserInteractionEnabled:YES];
        
        UIView * v=[container viewWithTag:20000];
        if ([v isEqual:backgroundView])
        {
            return;
        }
        if (v)
        {
            [v removeFromSuperview];
        }
        float h=container.frame.size.height;
        if (![backgroundView isKindOfClass:[UIImageView class]])
        {
            h=44;
        }
        CGRect rect=backgroundView.frame;
        rect.origin.x=0;
        rect.origin.y=container.frame.size.height-h;
        rect.size.width=bgview.frame.size.width;
        rect.size.height=h;
        [backgroundView setFrame:rect];
        [backgroundView setTag:20000];
        [container addSubview:backgroundView];
    }
}

是不是看到了个不和谐的词** release** ,好吧,这是个最低要适配到6.0的古董级的项目了....

排查问题

当时看了他的导航视图,我的第一反应是,为什么不自定义个呢?岂不是要省事很多?好吧,系统的有问题,也是需要解决的,原谅我自定义的导航用多了...
我第一个想到的是,这个bgView是不是存在的,所以打个断点后发现,这个bgView是nil,所以我重新打印了导航视图的子视图:

(
    "<_UIBarBackground: 0x7f86cdd0b4e0; frame = (0 0; 320 44); userInteractionEnabled = NO; layer = <CALayer: 0x6000000273c0>>",
    "<_UINavigationBarBackIndicatorView: 0x7f86cdc0d6c0; frame = (0 11.5; 13 21); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x60800002a660>>"
)

发现其背景视图名称变了,暗自高兴,这么容易就找到了,欢欢喜喜的修改了如下代码:

if ([classname isEqualToString:@"_UINavigationBarBackground"] || [classname isEqualToString:@"UINavigationBarBackground"])

// 将遍历子视图时的判断条件更改为
if ([classname isEqualToString:@"_UINavigationBarBackground"] || [classname isEqualToString:@"UINavigationBarBackground"]||[classname isEqualToString:@"_UIBarBackground"])

运行,结果却....还是不显示!!!
再看断点处的bgView,确实也拿到了这个背景view,那是怎么回事呢?
然后,使用可视化视图调试Debug View Hierarchy看了下视图的层次关系:
在Xcode7.3-iOS9.3如下图:

Xcode7.3-iOS9.3

导航条的视图布局如下:

导航条视图布局

而在Xcode8-iOS10则变成这样了:

Xcode8-iOS10层级关系

而导航条的布局为:

Xcode8导航条布局

发现,添加的视图是存在的,但是为什么不显示呢?
仔细观察两个视图的区别会发现,在Xcode8上,添加的视图上面还覆盖了一个视图UIVisualEffectView,而在Xcode7.3上这个模糊视图是不存在的,其实仔细观察未显示图片的导航条也会发现,隐隐约约能够看到一些下面图片颜色,这里就是中间有点灰色,这是因为这个模糊视图把下面的图片覆盖了,所以没有显示出来,这才是图片不显示的根本原因.

解决问题

找到原因了,修改代码就比较容易了,你可以在添加视图时,将bgView指定到UIVisualEffectView,将新的视图添加到UIVisualEffectView上:

for (UIView  * v in subs)
    {
        NSString * classname = NSStringFromClass([v class]);
        if ([classname isEqualToString:@"_UINavigationBarBackground"] || [classname isEqualToString:@"UINavigationBarBackground"])
        {
            
            bgview=v;
            break;
        }  else if ([classname isEqualToString:@"_UIBarBackground"]) {
            //适配iOS10导航
            for (UIView *vi in v.subviews) {
                
                NSString *viName = NSStringFromClass([vi class]);
                if ([viName isEqualToString:@"UIVisualEffectView"]) {
                    
                    bgview = vi;
                    break;
                }
            }
        }
    }

也可以还添加到_UIBarBackground上,但是找到UIVisualEffectView,将其隐藏掉:

if ([classname isEqualToString:@"_UINavigationBarBackground"] || [classname isEqualToString:@"UINavigationBarBackground"])
        {
            
            bgview=v;
            break;
        } else if ([classname isEqualToString:@"_UIBarBackground"]) {
            
            bgview = v;
            
            for (UIView *vi in v.subviews) {
                // 适配iOS10
                NSString *viName = NSStringFromClass([vi class]);
                if ([viName isEqualToString:@"UIVisualEffectView"]) {
                    
                    vi.hidden = YES;
                    break;
                }
            }
        }

再运行,会发现,问题解决:

Xcode8-iOS10

到此这个问题就解决完毕,如果有其他的解决途径,还请不吝赐教,感谢!!!

(完)

Github LQQZYY
CSDN博客 流火绯瞳
新浪微博 杯水_沧海
QQ 302934443
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,388评论 0 12
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 原文地址:http://www.cnblogs.com/oc-bowen/p/5916630.html 主要为了自...
    今天又要上班吗阅读 1,287评论 1 4
  • 立冬小雪间,天气将转寒。 叶稀大河涧,孤身被不暖。 遥在湟水畔,望南问几遍。 小雪可当归?红炉已备齐。 珠珠原创诗文
    梅园遗珠阅读 121评论 0 1
  • 晚上和先生散步的时候谈到“死亡”这个话题,这是一个刚听起来很沉重的话题,但慢慢谈开发现这是你我逃不开的命题,人生...
    四叶草软软阅读 574评论 0 0