最近看到一個問題猛频,就是在有app后臺持續(xù)定位或是正在打電話亦或是個人正在連接你分享的熱點時馋吗,手機(jī)上方會有個提示的藍(lán)條(綠條或是紅條)缺猛,場景就是這樣拷沸,此時您打開某款app會發(fā)現(xiàn)自己的頁面視圖整體下移特別是一些app底部放視圖的情況此時很可能出現(xiàn)問題中姜,經(jīng)測試發(fā)現(xiàn)UITabbarContrller底部的tabbar不會受此影響消玄,QQ在遇到這種情況時會在有藍(lán)條和藍(lán)條消失時刷新頁面,有興趣的可以自行測試丢胚,刷新的效果還是很明顯的翩瓜,會看到底部視圖的抖動(我測試的頁面是聊天頁面的底部輸入視圖)
下圖可看出有沒有藍(lán)條對QQ底部視圖沒有影響,但是你會明顯感覺到QQ這個頁面的刷新效果(說明QQ考慮到了這種情況并做了相應(yīng)的處理)
咱們先看一下有問題的視圖和正常的視圖
這個就比較明顯了嗜桌,出現(xiàn)藍(lán)條時奥溺,明顯底部視圖超出了手機(jī)屏幕,不是很友好的感覺骨宠,這是作為一個強(qiáng)迫癥所不能接受的浮定,怎么能遛出屏幕呢相满,今天終于有時間解決一下這個問題。
上圖很清晰的解釋了這個問題桦卒,導(dǎo)航控制器中立美,iphone6在- (void)viewDidLoad中獲取的self.view的height為667,- (void)viewDidAppear:(BOOL)animated中獲取的height為603方灾,在有藍(lán)條時這個height變?yōu)榱?83建蹄,有興趣的可以試一下,至此問題找到了裕偿。
解決思路
1洞慎、看一下有沒有什么方法可以檢測這個藍(lán)條的出現(xiàn)和消失,可以度娘上沒有這個嘿棘,自己也沒有這方面的開發(fā)經(jīng)驗劲腿,這種方法也就作罷了;
2鸟妙、使用KVO鍵值觀察者焦人,既然self.view的height會改變,咱們就檢測self.view的frame的改變重父,果然問題完美解決花椭,下面是過程
- (void)viewDidLoad中
[self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew || NSKeyValueChangeOldKey context:nil];
實現(xiàn)frame變化時的回調(diào)方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"frame"]) {
NSValue *value = change[@"new"];
CGRect frame = [value CGRectValue];
self.backTextField.frame = CGRectMake(0, CGRectGetHeight(frame)-44, CGRectGetWidth(frame), 44);
}
}
在做這個地方時遇到一個小問題,回調(diào)方法中(NSDictionary<NSKeyValueChangeKey,id> *)change有兩個key
{
kind = 1;
new = "NSRect: {{0, 64}, {375, 603}}";
}
咱們需要的就是這個new的value值房午,乍一看這不是NSString類型嗎直接使用CGRectFromNsstring()可得到新的frame矿辽,經(jīng)測試,崩潰了歪沃,對就是崩潰了嗦锐,一查才知道這個new對應(yīng)的value是一個NSConcreteValue類型,這個東西若是基礎(chǔ)類型就是NSNumber沪曙,結(jié)構(gòu)體就是NSValue,改為NSValue萎羔,就完美的解決了問題液走,看效果:
有無藍(lán)條底部視圖展示位置不變。
Demo地址https://github.com/wenchang1989/CWCBlueLineBottomView