在iOS開發(fā)中向族,底部的tabBar通常都是需要自定義,因?yàn)橄到y(tǒng)自帶的或多或少和我們要求的總有一點(diǎn)的出入。
在自定義tabBar后,通常做法就是移除系統(tǒng)的tabBar來防止出現(xiàn)重影的問題易结。
在iPhoneX之前我們通常都是在導(dǎo)航中使用這樣的方法來移除系統(tǒng)的tabBar的。
方法一:在自定義的UINavigationController中的下面方法中這樣寫:
- (void)navigationController:(UINavigationController*)navigationController willShowViewController:(UIViewController*)viewController animated:(BOOL)animated{
// 刪除系統(tǒng)自帶的tabBarButton
for (UIView *tabBar in self.tabBarController.tabBar.subviews) {
if ([tabBar isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
[tabBarremoveFromSuperview];
}
}
}
方法二:或者在自定義的TabBarController中的下面方法中這樣寫:
視圖即將出現(xiàn)時(shí)進(jìn)行刪除柜候。
效果自然能夠?qū)崿F(xiàn)搞动。因?yàn)檫@是在iphoneX,iphoneX Max之前最常用的消除系統(tǒng)系統(tǒng)tabBar的方法。
但是渣刷!在iphoneX,iphoneX Max之后鹦肿,我們?cè)谶m配的時(shí)候,如果還是只加上這些代碼的話辅柴,在進(jìn)入初始界面的時(shí)候狮惜,并沒有發(fā)現(xiàn)什么問題(正常)高诺。如圖3:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
for (UIView *tabBar in self.tabBarController.tabBar.subviews) {
if([tabBar isKindOfClass:NSClassFromString(@"UITabBarButton")]){
[tabBar removeFromSuperview];
}
}
}
但當(dāng)進(jìn)入二級(jí)頁面再返回后就會(huì)發(fā)現(xiàn)變成如下圖4所示樣式了:
解決方法:
在自定義的TabBarController中。添加刪除系統(tǒng)tabBar的代碼碾篡。具體如下 圖5:
// 解決iphoneX在返回時(shí)候tabb出現(xiàn)重影的問題
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
for (UIView *view in self.tabBar.subviews) {
if(![viewisKindOfClass:[MainTabBarclass]]) {
[viewremoveFromSuperview];
}
}
}
這樣就完美解決了iphoneX,iphoneX Max上虱而,在返回時(shí)候tabb出現(xiàn)重影的問題。
大概原理:在iphoneX,iphoneX Max中开泽,系統(tǒng)的控件(似乎是)只能隱藏牡拇,不能刪除,再返回的時(shí)候穆律,系統(tǒng)會(huì)自動(dòng)判斷惠呼,添加已刪除的系統(tǒng)控件。(具體的真實(shí)性有待研究)峦耘。
這兩者的代碼區(qū)別是剔蹋,前者我們只刪除一次,后者是在前者基礎(chǔ)上再刪除一次辅髓,以防出現(xiàn)的時(shí)候不能刪除,在viewWillAppear中刪除只是保證刪除一次泣崩。所以要進(jìn)行多次刪除。
這樣多次刪除會(huì)不會(huì)把本來不存在的刪除會(huì)出現(xiàn)空指針訪問錯(cuò)誤洛口?
不會(huì)的矫付。因?yàn)槲覀兪潜闅v他的子控件時(shí)是發(fā)現(xiàn)有才去刪除,所以并不會(huì)刪除不存在的東西。
到此第焰,iPhoneX自定義tabBar造成的重影問題完美解決买优。