2011-07-29 170 views
3

我有一個基於導航的應用程序,用戶可以隱藏狀態欄。這是在默認設置下記住的。隱藏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]; 
} 
+0

嘗試調用[self.view setNee dsDisplay] –

+0

沒有self.view,這是在應用程序委託。你的意思是navigationController.view? – jrturton

+0

是的當然,無論當前的視圖是 –

回答

1

問題在於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]; 
} 
0

據我知道,如果你隱藏狀態欄你的看法自動佔據了新的空間,您不必手動更改窗口框架。如果你試試這個,會發生什麼?

if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar) 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide]; 
} 
+1

這導致了導航欄的位置 - 這是我最初開始的地方,試圖隱藏狀態欄並在導航控制器上設置wantsfullscreenlayout屬性。 – jrturton

1

窗口總是在狀態欄的下方,所以你不應該嘗試調整它的大小。

取而代之,將窗口根視圖控制器的視圖調整爲[[UIScreen mainScreen] applicationFrame]

+0

該窗口沒有設置rootviewcontroller插口,是否應該是導航控制器? – jrturton

+0

對不起,忽略它是在代碼中設置的。 – jrturton

+0

是的。對不起,我應該更清楚了。調整你在'applicationDidFinishLaunching:withOptions:'(幾乎可以肯定你的導航控制器的視圖)作爲窗口的子視圖添加的任何視圖的大小。 rootViewController屬性是您可以設置它的新方式,但大多數應用程序仍然只是將視圖控制器的視圖添加爲窗口的子視圖。 – cduhn

0

這就是解決了這個問題對我來說

只是一個觀點:

[self.view setFrame: [self.view bounds]]; 

與滾動視圖的視圖裏面

[self.view setFrame: [self.view bounds]]; 
[self.theScroller setFrame: [self.view bounds]]; 

「theScroller的名稱是我的滾動視圖