4

ビューがロードされたにステータスバーを非表示にすると、少し奇妙な問題が発生します。ViewDidLoadメソッドに次のメソッドを追加すると、ステータスバーがビューから完全に削除されます。

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

ただし、このメソッドをIBActionまたは別のメソッドで呼び出すと、ステータスバーはスライドして離れますが、黒いバーはそれ自体と同じ高さのままになります。

ビュー全体を20px上にシフトすることを考えましたが、これは本当に修正されますか?将来のOSアップグレードでステータスバーの高さが変更された場合に備えて、黒いバーを重ねたくありません。

黒いバーを離れるステータスバー

4

5 に答える 5

3

任意の数をハードコーディングすることは、常に将来の保証に反します。あなたの懸念は正しいです。statusBarの非表示を適切に処理するには、ちょっとしたコツがあります。しかし、必要なすべての情報が利用可能です。

たとえば、UIApplicationシングルトンには、のフレームのように聞こえるという名前のプロパティがありますstatusBarFrame。クールなのは、そのプロパティを呼び出すと、アニメーションが完了する前であっても、新しいフレームが表示されることです。したがって、実際には、'sを調整するための基本的な計算が必要になります。CGRectstatusBarsetStatusBarHidden:withAnimation:viewframe

要するに、あなたの腸の感覚は正しいです。常にライブで計算します。

私はこのようなカテゴリーメソッドで成功しました。(シミュレーターで通話中のステータスバーを切り替える場合でも(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
于 2012-10-17T05:50:51.897 に答える
0

なぜこれを呼んでいるのviewDidLoadですか?

loadViewで試してみませんか?

- (void)loadView {
    [super loadView];

    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}
于 2012-10-17T00:23:23.863 に答える
0

はい、ビューを20ピクセル移動すると、問題が解決するはずです。黒は、実際の黒いバーではなく、表示するものがないことを意味します。

潜在的なステータスの高さの変更については、ビューが新しいステータスバーの高さだけ移動するため、この修正は機能しません。その場合は、ステータスバーごとに異なるオフセットを追加するか、まったく新しい解決策を見つける必要があります。

于 2012-10-17T04:04:54.307 に答える
0

viewWillAppear

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

viewDidAppear、次を挿入できます。

self.view.window.rootViewController.view.frame = [UIScreen mainScreen].applicationFrame;

viewWillDisappear

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
于 2013-09-19T20:10:57.800 に答える
0

私は電話することでこの問題を修正することができました:

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

黒いバーを表示しているViewControllerを表示する前に、他の人が推奨しているように。

たとえば、ViewController私が提示したアクションがある場合、私はそれを次のように呼びます:

- (IBAction)presentViewController:(id)sender {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
}
于 2016-08-15T19:05:39.257 に答える