[iOS10]Xcode8系統(tǒng)導(dǎo)航適配

開發(fā)環(huán)境

Xcode 8
iOS 10

Xcode 7.3
iOS9.3

問題

最近有個(gè)朋友問我,在適配iOS10的時(shí)候,導(dǎo)航的圖片不顯示了,使用的是系統(tǒng)導(dǎo)航,怎么調(diào)整都不顯示.
在Xcode7.3,iOS9.3顯示如下:

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

導(dǎo)航中間位置有一個(gè)LOGO視圖(當(dāng)然不是這個(gè)條形碼),而在Xcode8-iOS10上,這個(gè)視圖不顯示了,如下:

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];
    }
}

是不是看到了個(gè)不和諧的詞** release** ,好吧,這是個(gè)最低要適配到6.0的古董級(jí)的項(xiàng)目了....

排查問題

當(dāng)時(shí)看了他的導(dǎo)航視圖,我的第一反應(yīng)是,為什么不自定義個(gè)呢?豈不是要省事很多?好吧,系統(tǒng)的有問題,也是需要解決的,原諒我自定義的導(dǎo)航用多了...
我第一個(gè)想到的是,這個(gè)bgView是不是存在的,所以打個(gè)斷點(diǎn)后發(fā)現(xiàn),這個(gè)bgView是nil,所以我重新打印了導(dǎo)航視圖的子視圖:

(
    "<_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>>"
)

發(fā)現(xiàn)其背景視圖名稱變了,暗自高興,這么容易就找到了,歡歡喜喜的修改了如下代碼:

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

// 將遍歷子視圖時(shí)的判斷條件更改為
if ([classname isEqualToString:@"_UINavigationBarBackground"] || [classname isEqualToString:@"UINavigationBarBackground"]||[classname isEqualToString:@"_UIBarBackground"])

運(yùn)行,結(jié)果卻....還是不顯示!!!
再看斷點(diǎn)處的bgView,確實(shí)也拿到了這個(gè)背景view,那是怎么回事呢?
然后,使用可視化視圖調(diào)試Debug View Hierarchy看了下視圖的層次關(guān)系:
在Xcode7.3-iOS9.3如下圖:

Xcode7.3-iOS9.3

導(dǎo)航條的視圖布局如下:

導(dǎo)航條視圖布局

而在Xcode8-iOS10則變成這樣了:

Xcode8-iOS10層級(jí)關(guān)系

而導(dǎo)航條的布局為:

Xcode8導(dǎo)航條布局

發(fā)現(xiàn),添加的視圖是存在的,但是為什么不顯示呢?
仔細(xì)觀察兩個(gè)視圖的區(qū)別會(huì)發(fā)現(xiàn),在Xcode8上,添加的視圖上面還覆蓋了一個(gè)視圖UIVisualEffectView,而在Xcode7.3上這個(gè)模糊視圖是不存在的,其實(shí)仔細(xì)觀察未顯示圖片的導(dǎo)航條也會(huì)發(fā)現(xiàn),隱隱約約能夠看到一些下面圖片顏色,這里就是中間有點(diǎn)灰色,這是因?yàn)檫@個(gè)模糊視圖把下面的圖片覆蓋了,所以沒有顯示出來,這才是圖片不顯示的根本原因.

解決問題

找到原因了,修改代碼就比較容易了,你可以在添加視圖時(shí),將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導(dǎo)航
            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;
                }
            }
        }

再運(yùn)行,會(huì)發(fā)現(xiàn),問題解決:

Xcode8-iOS10

到此這個(gè)問題就解決完畢,如果有其他的解決途徑,還請(qǐng)不吝賜教,感謝!!!

(完)

Github LQQZYY
CSDN博客 流火緋瞳
新浪微博 杯水_滄海
QQ 302934443
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沛贪,一起剝皮案震驚了整個(gè)濱河市泰讽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌午乓,老刑警劉巖署恍,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碧查,死亡現(xiàn)場(chǎng)離奇詭異约啊,居然都是意外死亡喻喳,警方通過查閱死者的電腦和手機(jī)另玖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸枯,“玉大人日矫,你說我怎么就攤上這事赂弓“罅瘢” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵盈魁,是天一觀的道長翔怎。 經(jīng)常有香客問我,道長杨耙,這世上最難降的妖魔是什么赤套? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮珊膜,結(jié)果婚禮上容握,老公的妹妹穿的比我還像新娘。我一直安慰自己车柠,他們只是感情好剔氏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竹祷,像睡著了一般谈跛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塑陵,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天感憾,我揣著相機(jī)與錄音,去河邊找鬼令花。 笑死阻桅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兼都。 我是一名探鬼主播嫂沉,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俯抖!你這毒婦竟也來了输瓜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尤揣,沒想到半個(gè)月后搔啊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡北戏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年负芋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗜愈。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旧蛾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蠕嫁,到底是詐尸還是另有隱情锨天,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布剃毒,位于F島的核電站病袄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赘阀。R本人自食惡果不足惜益缠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望基公。 院中可真熱鬧幅慌,春花似錦、人聲如沸轰豆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秒咨。三九已至喇辽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雨席,已是汗流浹背菩咨。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陡厘,地道東北人抽米。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像糙置,于是被迫代替她去往敵國和親云茸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細(xì)...
    uniapp閱讀 4,405評(píng)論 0 12
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫谤饭、插件标捺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 原文地址:http://www.cnblogs.com/oc-bowen/p/5916630.html 主要為了自...
    今天又要上班嗎閱讀 1,292評(píng)論 1 4
  • 立冬小雪間懊纳,天氣將轉(zhuǎn)寒。 葉稀大河澗亡容,孤身被不暖嗤疯。 遙在湟水畔,望南問幾遍闺兢。 小雪可當(dāng)歸茂缚?紅爐已備齊。 珠珠原創(chuàng)詩文
    梅園遺珠閱讀 124評(píng)論 0 1
  • 晚上和先生散步的時(shí)候談到“死亡”這個(gè)話題屋谭,這是一個(gè)剛聽起來很沉重的話題脚囊,但慢慢談開發(fā)現(xiàn)這是你我逃不開的命題,人生...
    四葉草軟軟閱讀 576評(píng)論 0 0