2010-10-16 165 views
14

我正在創建一個iphone應用程序,裏面有很少的元素(例如標籤欄,uiview,uitoolbar等)。一切正常,直到我遇到這個問題。當我的應用程序啓動時,我收到一個電話,並顯示「呼叫狀態欄」,它毀了用戶界面。由於「呼叫狀態欄」佔據頂部的空間,部分元素被壓低。Iphone-如何在通話狀態欄切換時調整視圖大小?

有人在這裏有一個想法如何解決這個問題?我是iPhone應用程序開發的新手。

您的回覆,非常感謝......

最好的問候,

回答

12

你應該把這個功能上的appDelegate,這將觸發時,狀態欄的變化

- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setObject:@"trigger" forKey:@"frame"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict]; 
} 

此代碼將發送通知的名稱爲「觸發」

的地方,您的視圖控制器代碼(例如:viewDidLoad中,等。)這個聽,如果有通知,名字「觸發」

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(dataReceived:) 
              name:@"trigger" 
              object:nil]; 

發送並創建一個功能dataReceived:

- (void)dataReceivedNotification:(NSNotification *)notification { 
    NSDictionary *data = [notification userInfo]; 
    // do something with data 
} 

做一些事情上的這部分代碼,也許你改變你的標籤欄,UIView的框架,工具欄架

而在dealloc的框架,把這個代碼刪除觀察者

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+0

這適用於我......謝謝 – 2010-10-16 02:51:02

+0

請參閱@ process255以獲得更正確的答案。另外使用裸字符串來發布/訂閱通知是不好的做法(容易出錯和拼寫錯誤,您應該事先定義您的'NSString * const'通知名稱)。 – 2014-08-05 11:35:02

+0

@dianz你已經在字典中切換了鍵值。 「觸發」應該是關鍵。 – Kof 2014-12-07 08:41:21

3

基本上你通常做的是試圖建立你的所有UI元素的自動調整大小旗幟界面生成器,這樣,當主視圖被通話狀態欄「壓扁」,一切仍將看起來合理。解釋如何在一條消息中完成所有這些都很困難,但我建議在IB中創建一個視圖,在其中放置一些子視圖,然後調整主視圖的大小,同時使用autoresize標誌來獲得標記工作。 autoresize標誌位於Command-3(大小檢查器)中。

您也可以將主視圖控制器中的wantsFullScreenLayout設置爲YES,以使視圖佔據整個屏幕,包括狀態欄下的區域,但是您必須確保不要在當然,狀態欄和通話狀態欄會重疊太近。

+0

對於iOS7/AutoLayout約束環境呢? – 2013-07-23 23:37:42

21

dianz的解決方案工作得很好,但如果您只想瞭解特定視圖控制器內部的通知,則有點多餘。

在應用委託中調用委託方法application:didChangeStatusBarFrame:之後UIApplicationDidChangeStatusBarFrameNotification通過[NSNotificationCenter defaultCenter]發佈。

代替使用委託方法application:didChangeStatusBarFrame:來簡單地重新發布自定義通知,您可以直接從您的視圖控制器添加觀察者到UIApplicationDidChangeStatusBarFrameNotification

在MyCustomViewController將添加類似這樣:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doSomething:) 
              UIApplicationDidChangeStatusBarFrameNotification 
              object:nil]; 

現在你不再需要的appDelegate定義application:didChangeStatusBarFrame:委託方法(除非你打算做什麼東西在的appDelegate時,狀態欄更改大小)。

與dianz的例子中,你需要刪除觀察者的dealloc

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+5

偉大的答案,除了你意外(基於原來的問題,無論如何)使用'UIApplicationWillChangeStatusBarOrientationNotification'而不是'UIApplicationWillChangeStatusBarFrameNotification'。如果您試圖找出通話中綠色狀態欄何時出現或消失,您需要後者:「UIApplicationWillChangeStatusBarFrameNotification」。 – 2012-06-22 17:42:57

+0

非常真實,感謝您的更新! – 2014-04-03 09:56:10

1

對我來說,只要狀態欄放大, - (無效)viewWillLayoutSubviews總是被調用。這對我來說是完美的,因爲我所有的子視圖setFrame代碼都在這個函數中。

相關問題