我正在創建一個iphone應用程序,裏面有很少的元素(例如標籤欄,uiview,uitoolbar等)。一切正常,直到我遇到這個問題。當我的應用程序啓動時,我收到一個電話,並顯示「呼叫狀態欄」,它毀了用戶界面。由於「呼叫狀態欄」佔據頂部的空間,部分元素被壓低。Iphone-如何在通話狀態欄切換時調整視圖大小?
有人在這裏有一個想法如何解決這個問題?我是iPhone應用程序開發的新手。
您的回覆,非常感謝......
最好的問候,
我正在創建一個iphone應用程序,裏面有很少的元素(例如標籤欄,uiview,uitoolbar等)。一切正常,直到我遇到這個問題。當我的應用程序啓動時,我收到一個電話,並顯示「呼叫狀態欄」,它毀了用戶界面。由於「呼叫狀態欄」佔據頂部的空間,部分元素被壓低。Iphone-如何在通話狀態欄切換時調整視圖大小?
有人在這裏有一個想法如何解決這個問題?我是iPhone應用程序開發的新手。
您的回覆,非常感謝......
最好的問候,
你應該把這個功能上的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];
}
基本上你通常做的是試圖建立你的所有UI元素的自動調整大小旗幟界面生成器,這樣,當主視圖被通話狀態欄「壓扁」,一切仍將看起來合理。解釋如何在一條消息中完成所有這些都很困難,但我建議在IB中創建一個視圖,在其中放置一些子視圖,然後調整主視圖的大小,同時使用autoresize標誌來獲得標記工作。 autoresize標誌位於Command-3(大小檢查器)中。
您也可以將主視圖控制器中的wantsFullScreenLayout
設置爲YES,以使視圖佔據整個屏幕,包括狀態欄下的區域,但是您必須確保不要在當然,狀態欄和通話狀態欄會重疊太近。
對於iOS7/AutoLayout約束環境呢? – 2013-07-23 23:37:42
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];
}
偉大的答案,除了你意外(基於原來的問題,無論如何)使用'UIApplicationWillChangeStatusBarOrientationNotification'而不是'UIApplicationWillChangeStatusBarFrameNotification'。如果您試圖找出通話中綠色狀態欄何時出現或消失,您需要後者:「UIApplicationWillChangeStatusBarFrameNotification」。 – 2012-06-22 17:42:57
非常真實,感謝您的更新! – 2014-04-03 09:56:10
對我來說,只要狀態欄放大, - (無效)viewWillLayoutSubviews總是被調用。這對我來說是完美的,因爲我所有的子視圖setFrame代碼都在這個函數中。
這適用於我......謝謝 – 2010-10-16 02:51:02
請參閱@ process255以獲得更正確的答案。另外使用裸字符串來發布/訂閱通知是不好的做法(容易出錯和拼寫錯誤,您應該事先定義您的'NSString * const'通知名稱)。 – 2014-08-05 11:35:02
@dianz你已經在字典中切換了鍵值。 「觸發」應該是關鍵。 – Kof 2014-12-07 08:41:21