iOS10.0適配-導(dǎo)航欄問(wèn)題

最近ios10.0發(fā)布回溺,發(fā)現(xiàn)app在系統(tǒng)10.0下運(yùn)行啤贩,導(dǎo)航欄出現(xiàn)了若干bug,遂著手解決之宏悦。

1.復(fù)現(xiàn):

在ios9及以下的系統(tǒng)中無(wú)問(wèn)題镐确,但是在ios10.0下會(huì)出現(xiàn)如下bug(返回按鈕和titleView都不顯示):

返回按鈕及titleView都不顯示

項(xiàng)目中使用了UINavigationBar + Extension擴(kuò)展,通過(guò)對(duì)UINavigationBar添加子視圖的方式設(shè)置背景圖饼煞。

使用的源碼如下:

-(void)ls_setBackgroundColor:(UIColor *)backgroundColor{

if (!self.overlay) {

[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

//導(dǎo)航欄下面有一條1像素高的灰色的線(xiàn)源葫,這是一張圖片,可能過(guò)設(shè)置shadowImage修改

self.shadowImage = [UIImage new];

self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, -20, [UIScreen mainScreen].bounds.size.width, CGRectGetHeight(self.bounds) + 20)];

self.overlay.userInteractionEnabled = NO;

self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

[self insertSubview:self.overlay atIndex:0];

}

self.overlay.backgroundColor = backgroundColor;

}

2.原因分析:

這個(gè)bug比較奇怪砖瞧,在ios9及以下的系統(tǒng)中顯示是正常的息堂,但是ios10.0視圖卻顯示不出來(lái)。由于創(chuàng)建的視圖未按預(yù)期顯示,

首先荣堰,通過(guò)Debug->View Debugging->Capture View Hierarchy查看視圖層級(jí)關(guān)系床未。發(fā)現(xiàn)返回按鈕和titleView是存在的,但是被overlay視圖擋住了振坚,所以未顯示出來(lái)薇搁。如圖:

存在的視圖,但是被覆蓋了


然后渡八,打印navigationBar的子視圖啃洋,發(fā)現(xiàn)有2個(gè)成員:

<_UIBarBackground: 0x7fd5fb76c490; frame = (0 -20; 375 64); userInteractionEnabled = NO; layer = 0x60000022a740>
<_UINavigationBarBackIndicatorView: 0x7fd5fb446160; frame = (8 11.5; 13 21); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer =0x608000435e60> - Back

navigationBar高度是44,上方是statusBar屎鳍。很明顯_UIBarBackground決定了導(dǎo)航欄的背景色及顯示樣式宏娄,因此可以考慮在_UIBarBackground上添加子視圖,用于顯示背景色或圖片逮壁。

最后孵坚,修復(fù)了該bug。修改后代碼如下:

3.解決方案:

static char overlayKey;

@implementation UINavigationBar (Extension)

- (UIView *)overlay{

return objc_getAssociatedObject(self, &overlayKey);

}

- (void)setOverlay:(UIView *)overlay{

objc_setAssociatedObject(self, &overlayKey, overlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

-(void)ls_setBackgroundColor:(UIColor *)backgroundColor{

if (!self.overlay) {

[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

//去掉灰色的線(xiàn)窥淆。其實(shí)這個(gè)線(xiàn)也是image控制的卖宠。設(shè)為空即可

self.shadowImage = [UIImage new];

UIView *barBgView = self.subviews.firstObject;

self.overlay = [[UIView alloc] initWithFrame:barBgView.bounds];

self.overlay.userInteractionEnabled = NO;

self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

[barBgView addSubview:self.overlay];

}

self.overlay.backgroundColor = backgroundColor;

}

@end

可以解決ios10下的導(dǎo)航欄問(wèn)題。正常的顯示效果為:

返回按鈕和titleView顯示出來(lái)了

4.思維發(fā)散:

既然實(shí)現(xiàn)了導(dǎo)航樣單一顏色設(shè)置忧饭,如果要顯示為圖片又該如何改呢逗堵,是否要新添加一個(gè)UIImageView子視圖?

實(shí)際上不需要眷昆,可以通過(guò)overlay的圖層的寄宿圖實(shí)現(xiàn),核心代碼如下:

self.overlay.layer.contents = (__bridge id)GET_IMAGE(@"welcome1").CGImage;

在實(shí)踐中汁咏,如果你給contents賦的不是CGImage亚斋,那么得到的圖層將是空白的。它真正要賦值的類(lèi)型應(yīng)該是CGImageRef攘滩,一個(gè)指向CGImage結(jié)構(gòu)的指針帅刊。

另外,可以設(shè)置顯示方式:

self.layerView.layer.contentsGravity = kCAGravityResizeAspect;

contentsGravity的效果等同于UIViewContentModeScaleAspectFit漂问, 同時(shí)它還能在圖層中等比例拉伸以適應(yīng)圖層的邊界赖瞒。

最后:

如果控件出現(xiàn)一些預(yù)料之外的行為,可以打開(kāi)XCode的view debugging查看視圖的位置和層級(jí)關(guān)系蚤假,找到問(wèn)題所在栏饮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市磷仰,隨后出現(xiàn)的幾起案子袍嬉,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伺通,死亡現(xiàn)場(chǎng)離奇詭異箍土,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)罐监,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)吴藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弓柱,你說(shuō)我怎么就攤上這事沟堡。” “怎么了吆你?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵弦叶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我妇多,道長(zhǎng)伤哺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任者祖,我火速辦了婚禮立莉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘七问。我一直安慰自己蜓耻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布械巡。 她就那樣靜靜地躺著刹淌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讥耗。 梳的紋絲不亂的頭發(fā)上有勾,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音古程,去河邊找鬼蔼卡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挣磨,可吹牛的內(nèi)容都是我干的雇逞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茁裙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼塘砸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起晤锥,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谣蠢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體眉踱,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挤忙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谈喳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片册烈。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婿禽,靈堂內(nèi)的尸體忽然破棺而出赏僧,到底是詐尸還是另有隱情,我是刑警寧澤扭倾,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布淀零,位于F島的核電站,受9級(jí)特大地震影響膛壹,放射性物質(zhì)發(fā)生泄漏驾中。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一模聋、第九天 我趴在偏房一處隱蔽的房頂上張望肩民。 院中可真熱鬧,春花似錦链方、人聲如沸持痰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)工窍。三九已至,卻和暖如春前酿,著一層夾襖步出監(jiān)牢的瞬間移剪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工薪者, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剿涮。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓言津,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親取试。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悬槽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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