任意の数をハードコーディングすることは、常に将来の保証に反します。あなたの懸念は正しいです。statusBarの非表示を適切に処理するには、ちょっとしたコツがあります。しかし、必要なすべての情報が利用可能です。
たとえば、UIApplication
シングルトンには、のフレームのように聞こえるという名前のプロパティがありますstatusBarFrame
。クールなのは、そのプロパティを呼び出すと、アニメーションが完了する前であっても、新しいフレームが表示されることです。したがって、実際には、'sを調整するための基本的な計算が必要になります。CGRect
statusBar
setStatusBarHidden:withAnimation:
view
frame
要するに、あなたの腸の感覚は正しいです。常にライブで計算します。
私はこのようなカテゴリーメソッドで成功しました。(シミュレーターで通話中のステータスバーを切り替える場合でも(Command-T)):
@implementation UIApplication (nj_SmartStatusBar)
// Always designate your custom methods by prefix.
-(void)nj_setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation{
UIWindow *window = [self.windows objectAtIndex:0];
UIViewController *rootViewController = window.rootViewController;
UIView *view = rootViewController.view;
// slight optimization to avoid unnecassary calls.
BOOL isHiddenNow = self.statusBarHidden;
if (hidden == isHiddenNow) return;
// Hide/Unhide the status bar
[self setStatusBarHidden:hidden withAnimation:animation];
// Get statusBar's frame
CGRect statusBarFrame = self.statusBarFrame;
// Establish a baseline frame.
CGRect newViewFrame = window.bounds;
// Check if statusBar's frame is worth dodging.
if (!CGRectEqualToRect(statusBarFrame, CGRectZero)){
UIInterfaceOrientation currentOrientation = rootViewController.interfaceOrientation;
if (UIInterfaceOrientationIsPortrait(currentOrientation)){
// If portrait we need to shrink height
newViewFrame.size.height -= statusBarFrame.size.height;
if (currentOrientation == UIInterfaceOrientationPortrait){
// If not upside-down move down the origin.
newViewFrame.origin.y += statusBarFrame.size.height;
}
} else { // Is landscape / Slightly trickier.
// For portrait we shink width (for status bar on side of window)
newViewFrame.size.width -= statusBarFrame.size.width;
if (currentOrientation == UIInterfaceOrientationLandscapeLeft){
// If the status bar is on the left side of the window we move the origin over.
newViewFrame.origin.x += statusBarFrame.size.width;
}
}
}
// Animate... Play with duration later...
[UIView animateWithDuration:0.35 animations:^{
view.frame = newViewFrame;
}];
}
@end