前言
iPhone X在主界面是UITabBarController的情況下,如果控制器的hidesBottomBarWhenPushed屬性設(shè)為true,進(jìn)行push操作之后會(huì)出現(xiàn)tabBar高度錯(cuò)亂的現(xiàn)象,先變矮一截,然后返回的時(shí)候又彈回到正常高度,非常影響使用感受,這應(yīng)該屬于iOS 11在iPhone X設(shè)備下自身的bug。(iOS 11為了適配全面屏真的搞出很多UI上的bug,惡心)
問(wèn)題復(fù)現(xiàn)
首先,UITabBarController上是一個(gè)UINavigationController
然后在UINavigationController上present一個(gè)UIViewController,dismiss掉
然后創(chuàng)建一個(gè)UIViewController,設(shè)置hidesBottomBarWhenPushed為true,pushViewController
這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)tabBar瞬間變矮了,里面的圖標(biāo)都漏出來(lái)了,非常不美觀
然后返回,你會(huì)發(fā)現(xiàn)tabBar又彈回正常高度了,這不膈應(yīng)人嗎
解決思路
既然我們知道了是tabBar的高度變化引起的,那么我們就對(duì)tabBar的高度下手,網(wǎng)上看到一些自定義UITabBar的方法,很不錯(cuò),但是稍微麻煩了點(diǎn),我的方法是用KVO監(jiān)聽(tīng)tabBar的frame,當(dāng)frame改變時(shí),我們?nèi)∫粋€(gè)高度最大的值重新布局tabBar就行了,沒(méi)有特殊定制情況下這種方式完全可以解決問(wèn)題了
代碼
class MyTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
tabBar.addObserver(self, forKeyPath: "frame", options: [.old, .new], context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let tabBar = object as? UITabBar, keyPath == "frame" {
if let oldFrame = change?[.oldKey] as? CGRect, let newFrame = change?[.newKey] as? CGRect {
if oldFrame.size != newFrame.size {
if oldFrame.height > newFrame.height {
tabBar.frame = oldFrame
} else {
tabBar.frame = newFrame
}
}
}
}
}
deinit {
tabBar.removeObserver(self, forKeyPath: "frame")
}
}
用OC的小伙伴自己改成OC代碼就行了,iPhone X的tabBar的高度為什么會(huì)在49和83之間來(lái)回跳,懵逼臉