開發(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顯示如下:
導(dǎo)航中間位置有一個(gè)LOGO視圖(當(dāng)然不是這個(gè)條形碼),而在Xcode8-iOS10上,這個(gè)視圖不顯示了,如下:
我看了他添加視圖的代碼,如下:
-(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如下圖:
導(dǎo)航條的視圖布局如下:
而在Xcode8-iOS10則變成這樣了:
而導(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),問題解決:
到此這個(gè)問題就解決完畢,如果有其他的解決途徑,還請(qǐng)不吝賜教,感謝!!!
(完)
Github | LQQZYY |
CSDN博客 | 流火緋瞳 |
新浪微博 | 杯水_滄海 |
302934443 |