我有一個基於導航的應用程序,用戶可以隱藏狀態欄。這是在默認設置下記住的。隱藏UIStatusBar /移動UINavigationBar
它主要是工作,除了一個例外,如果應用程序加載(從頭開始,返回到主屏幕後不返回)狀態欄應該是可見的,當它被切換到不可見時,導航欄不會向上移動以填滿屏幕。在此之後切換設置可正確地上下移動導航欄,但導航欄與屏幕頂部或狀態欄之間仍存在額外的狀態欄大小差異。如果我返回到主屏幕並重新進入應用程序,則會自行更正。因此,我認爲在返回到我需要在狀態欄切換後需要調用的應用程序時,uinavigationcontroller上會調用一些方法?
我試過(我認爲)wantsfullscreenlayout屬性的所有組合,我在下面的方法中設置它,但它沒有任何區別,所以我最終設置它(在導航控制器)在筆尖NO。
這裏是切換狀態欄的代碼。這是在我的應用程序委託中,根據模板應用程序將導航控制器和窗口設置爲插座。
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
window.frame = [[UIScreen mainScreen] applicationFrame];
}];
}
else
{
window.frame = [[UIScreen mainScreen] applicationFrame];
}
感謝您的幫助。
UPDATE
看來,通過NSLogging,問題出在UINavigationBar的的框架。所以我添加了下面的代碼,這個代碼很有效,但是我不滿意!我不覺得這可能是做到這一點的「正確」方式。在大多數情況下,額外的代碼不會執行任何操作,因爲框架已經在(0,0)處,但是在不正確的情況下,這會給出正確的結果。
[navigationController.view setNeedsLayout];
CGRect navBarFrame;
UINavigationBar *navBar = nil;
for (UIView *subView in navigationController.view.subviews)
{
if ([subView isMemberOfClass:[UINavigationBar class]])
{
navBar = (UINavigationBar *)subView;
navBarFrame = navBar.frame;
navBarFrame.origin = CGPointMake(0,0);
break;
}
}
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
window.frame = [[UIScreen mainScreen] applicationFrame];
navBar.frame = navBarFrame;
}];
}
else
{
window.frame = [[UIScreen mainScreen] applicationFrame];
}
嘗試調用[self.view setNee dsDisplay] –
沒有self.view,這是在應用程序委託。你的意思是navigationController.view? – jrturton
是的當然,無論當前的視圖是 –