2012-10-07 44 views
9

我已註冊接收有關狀態欄框架更改的通知,但它們從未收到。狀態欄框的更改沒有任何通知

這裏是我註冊的通知:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(appWillChangeStatusBarFrameNotification:) 
              name:UIApplicationWillChangeStatusBarFrameNotification 
              object:nil]; 

在我們的應用中的一些地方,我們顯示/隱藏與狀態欄:

[[UIApplication sharedApplication] setStatusBarHidden:maximize 
             withAnimation:UIStatusBarAnimationSlide]; 

但它也可以改變大小時個人熱點啓用或在打電話時。有什麼方法可以在實際狀態欄框架發生變化時獲取?

This question意味着由於SDK錯誤,通知不起作用,至少對於方向更改。這是原因嗎?有什麼解決方法嗎?

+0

嗯...適合我的方向變化,但不適用於setStatusBarHidden。當我在模擬器上模擬一個電話時,我確實得到它。 – rdelmar

回答

6

我知道這個問題發佈了一段時間後,但這個問題是一個惱人的! UIApplicationWillChangeStatusBarFrameNotificationUIApplicationDidChangeStatusBarFrameNotification通知僅觸發方向更改和通話狀態欄高度更改。

我通過編寫我自己的setStatusBarHidden類別函數來解決此問題,而不是使用正常的UIApplication函數。不幸的是(正如@progrmr指出的那樣),因爲狀態欄的高度可能是20像素或40像素(我們不知道隱藏狀態欄的框架會在未隱藏之前變成什麼樣子),但我們只能可靠地觸發具有正確userInfo的單個通知(UIApplicationDidChangeStatusBarFrameNotification)。下面是我所做的:

@implementation UIApplication (statusBar) 

- (void)setStatusBarHiddenWithNotification:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation 
{ 
    if (self.statusBarHidden == hidden) return; 

    [self setStatusBarHidden:hidden withAnimation:animation]; 
    [NSNotificationCenter.defaultCenter postNotificationName:UIApplicationDidChangeStatusBarFrameNotification 
                 object:nil 
                userInfo:@{UIApplicationStatusBarFrameUserInfoKey: [NSValue valueWithCGRect:self.statusBarFrame]}]; 
} 

@end 

這是稍微哈克,但我喜歡它,因爲我可以使用相同的通知觀察員監聽雙方通話中的狀態欄架的變化和我的手動setStatusBarHidden幀之間的變化。

希望這可以幫助別人!

+0

這是假定狀態欄高20點,通常是40點(在打電話時,熱點活躍時等),但這是個不錯的主意。 – progrmr

+0

好點。我不知道setStatusBarHidden實際上隱藏了通話狀態欄。我以爲它只隱藏了正常的狀態欄。那麼...我想你可以修改這個函數來觸發UIApplicationDidChangeStatusBarFrameNotification通知並傳遞userInfo中的實際狀態欄高度。 –

+0

@progrmr我修復了類別函數以使用UIApplication的statusBarFrame。不幸的是,這意味着我們不能再可靠地觸發附加了正確的userInfo的UIApplicationWillChangeStatusBarFrameNotification通知。 –