4

スライド効果を使用して、statusBarとnavigationBarを同時に表示および非表示にしたいのですが。

これが私が試した方法です:

[[UIApplication sharedApplication] setStatusBarHidden:hide withAnimation:UIStatusBarAnimationSlide];
[self.navigationController setNavigationBarHidden:hide animated:animated];

ただし、両方のアニメーションの長さは同じではありません。ステータスバーのアニメーションに時間がかかります。どちらのアニメーションの長さも指定する方法が見つかりませんでした。明らかな何かを見逃しましたか?

4

7 に答える 7

5

hiddenios-lizardの答えはほとんど私が望んでいたものですが、正しく設定されていない限り、デバイスを回転させるとナビゲーションバーが再表示されます。だからこれは私のために働いた:

アニメーション作品を隠す/見栄えがいいYEAH!!。

アニメーションの表示は問題ありません(ステータスバーをナビゲーションバーでスライドさせたいのですが、少なくともギャップは表示されなくなりました:D) 。

- (void)toggleFullscreen {

    UINavigationBar *navBar = self.navigationController.navigationBar;
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
    float animationDuration;
    if(statusBarFrame.size.height > 20) { // in-call
        animationDuration = 0.5;
    } else { // normal status bar 
        animationDuration = 0.6;
    }

    _fullscreen = !_fullscreen;
    if (_fullscreen) { 
        // Change to fullscreen mode
        // Hide status bar and navigation bar
        [[UIApplication sharedApplication] setStatusBarHidden:YES
                                                withAnimation:UIStatusBarAnimationSlide];
        [UIView animateWithDuration:animationDuration animations:^{
            navBar.frame = CGRectMake(navBar.frame.origin.x,
                                  -navBar.frame.size.height,
                                  navBar.frame.size.width,
                                  navBar.frame.size.height);
        } completion:^(BOOL finished) {
            [self.navigationController setNavigationBarHidden:YES animated:NO];
        }];

    } else {
        // Change to regular mode
        // Show status bar and navigation bar
        [[UIApplication sharedApplication] setStatusBarHidden:NO
                                                withAnimation:UIStatusBarAnimationSlide];
        [UIView animateWithDuration:animationDuration animations:^{
             navBar.frame = CGRectMake(navBar.frame.origin.x,
                                       statusBarFrame.size.height,
                                       navBar.frame.size.width,
                                       navBar.frame.size.height);
        } completion:^(BOOL finished) {
            [self.navigationController setNavigationBarHidden:NO animated:NO];
        }];

    }

}
于 2012-02-22T04:50:18.920 に答える
2

これが私のアプリでこの問題を修正した方法です。

    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

    // delta is the amount by which the nav bar will be moved
    delta = statusBarFrame.size.height + self.navigationController.navigationBar.frame.size.height;

    if(statusBarFrame.size.height>20) { // in-call
        animationDuration = 0.5;
    }
    else { // normal status bar 
        animationDuration = 0.6;
    }

    // hide status bar
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

    // hide nav bar
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];

    self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -delta);

    [UIView commitAnimations];
于 2012-01-20T10:46:59.230 に答える
1

明らかに、これを正しく行うための簡単な解決策はありません。Appleはそれを修正する必要があります。

もちろん、回避策の1つは、Ephraimが示唆するようにアルファフェードを使用することです。スライド動作を主張している場合は、ナビゲーションバーをアニメーション化し、アニメーションなしでステータスバーを表示/非表示にするのが最適であることがわかりました。アニメーション中のバー間のギャップが非常に目立つため、これはステータスバーをスライドするよりもはるかに見栄えがします。

于 2011-01-14T14:27:46.060 に答える
1

これは、アニメーションの継続時間にシステム定数を使用し、着信コールも処理する、より簡潔な方法です。

NavigationBarはアウトレットであり、statusBarHeightはインスタンス変数floatであることに注意してください。

- (IBAction)toggleControls:(id)sender {
    BOOL isHidden = ! [UIApplication sharedApplication].statusBarHidden;
    if (isHidden)
        statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
    [UIView animateWithDuration:[UIApplication sharedApplication].statusBarOrientationAnimationDuration animations:^{
        self.navigationBar.frame = CGRectMake(self.navigationBar.frame.origin.x,
                                              isHidden ? -self.navigationBar.frame.size.height : statusBarHeight,
                                              self.navigationBar.frame.size.width,
                                              self.navigationBar.frame.size.height);
    }];
    [[UIApplication sharedApplication] setStatusBarHidden:isHidden withAnimation:UIStatusBarAnimationSlide];
}
于 2013-04-29T22:07:18.087 に答える
1

nacho4dの答えはほとんど私が望んでいたものです。しかし、彼はnavBarが表示される前にnavBarのフレームを変更します。そのため、トランジションアニメーションが表示されません。navBarが突然表示されたようです。さらに、表示すると、statusBarFrame.size.heightは0になります。彼のコードは次のとおりです:</ p>

[[UIApplication sharedApplication] setStatusBarHidden:NO
                                            withAnimation:UIStatusBarAnimationSlide];
    [UIView animateWithDuration:animationDuration animations:^{
         navBar.frame = CGRectMake(navBar.frame.origin.x,
                                   statusBarFrame.size.height,
                                   navBar.frame.size.width,
                                   navBar.frame.size.height);
    } completion:^(BOOL finished) {
        [self.navigationController setNavigationBarHidden:NO animated:NO];
    }];

表示するときは、ナビゲーションバーでステータスバーをスライドさせたいと思います。これが私の答えです:

        UINavigationBar *navBar = self.navigationController.navigationBar;
        [[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationSlide];

        [UIView animateWithDuration:0.35 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
            // make navigationBar visual
            if (!hidden)
            {
                [self.navigationController setNavigationBarHidden:hidden animated:NO];
            }

            navBar.frame = CGRectMake(navBar.frame.origin.x,
                                      hidden ? -navBar.frame.size.height : 20,
                                      navBar.frame.size.width,
                                      navBar.frame.size.height);
        } completion:^(BOOL finished) {
            if (hidden)
            {
                [self.navigationController setNavigationBarHidden:hidden animated:NO];
            }
        }];
  1. 隠しているとき、そして隠されているときはNOに等しい。最初にnavBarのフレームを変更してから、navBarを非表示にする必要があります。
  2. を表示し、非表示にするとYESになります。最初にnavBarを視覚化し、次にフレームを変更します。
  3. 見栄えを良くするために、UIViewAnimationOptionCurveEaseOutを選択します。
于 2016-02-25T09:27:30.763 に答える
0

これはあまり答えではありませんが、機能します。だから私がしたことは:

// This method gets called by whatever action you want

- (void) toggleShowStatusNavBars:(id)sender {

    // Assuming you have a ivar called barsHidden

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.4]; // This is IMPORTANT, 0.4s

    self.navigationController.navigationBar.alpha = (barsHidden?1.0:0.0);  

    barsHidden = !barsHidden; 

    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(setStatusBarHidden)];

    [UIView commitAnimations];
}

- (void) setStatusBarHidden {
    [[UIApplication sharedApplication] setStatusBarHidden:barsHidden animated:YES];
}

これにより、基本的にアニメーションの開始が同期されます(setStatusBarHiddenナビゲーションバーのアニメーションの開始時に呼び出しているためです。重要なのは、ステータスバーのアニメーションに0.4秒かかるように見えることです。

これは私にとってはうまくいきますが、もっと良い方法を見つけたら、ここに投稿してください。

于 2010-10-05T16:50:39.997 に答える
0

インスタンス変数を使用してこれを行うことができます。

self.navigationController setNavigationBarHidden:hide animated:animated];
_shouldHideStatusBar = hide;

そして、次の関数を実装します。

- (BOOL)prefersStatusBarHidden{
    return _shouldHideStatusBar;
}

setNavigationBarHidden:animated関数は、prefersStatusBarHidden関数を自動的に呼び出します。そうでない場合は、次のUIViewControllerのメソッドを使用して呼び出すことができます。

[self setNeedsStatusBarAppearanceUpdate];

そしてもちろん、アニメーションスタイルを非表示にするステータスバーを次の方法で選択できます。

- (UIStatusBarAnimation) preferredStatusBarUpdateAnimation {
    return UIStatusBarAnimationSlide;
}
于 2014-08-21T12:40:01.170 に答える