web-dev-qa-db-ja.com

スムーズなアニメーションでナビゲーションバーを表示/非表示

ナビゲーションベースのアプリがあります。最初のビュー(rootcontroller)は、3つの大きなボタンのみで始まります。ナビゲーションバーはありません。そこから、他のすべてはテーブルビューであり、ナビゲーションバーがあります。私はこれをしてナビゲーションバーを表示/非表示にします:

MyAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.navigationController.navigationBar.hidden = NO;

ルートコントローラーを離れると、ナビゲーションバーが押し下げられるのではなく、テーブルビューの上部に移動します。テーブルビューの上部をクリップします。ルートコントローラーに戻ると、ナビゲーションバーが消える方法がスムーズではありません。ルートコントローラーのみのナビゲーションバーを非表示にするには、よりスムーズ/より良い方法がありますか?

51
4thSpace

[navigationController setNavigationBarHidden:YES animated:YES]を使用して、バーをスムーズに非表示にできます。

参照

118
James Raybould

この気の利いたコードは、UIの問題なくナビゲーションバーを非表示にします。

[navigationController setNavigationBarHidden: YES animated:YES]

しかし...

  1. self.navigationController.navigationBar.hiddenプロパティの代わりに、コードのチェックにself.navigationController.navigationBarHiddenプロパティを使用します。これにより、予期しないUIポジショニングの問題から多くの痛みを軽減できます。
  2. このメソッドは、ビューのライフサイクルの-(void)viewWillAppear:(BOOL)animated以降に配置するように注意してください。 -(void)viewDidLoadで行うと、ナビゲーションバーを表示するビューから表示しないビューへのアニメーション中に、見苦しい黒い長方形のビューが表示されるため、これが推奨されます。たとえば、ホームビューのナビゲーションバーが非表示になっているが、すべての子にナビゲーションバーが表示されている場合、ホームビューに移動すると、アニメーションが完了するまでナビゲーションバーの代わりに黒いバーが表示されます
11
codeburn

次の方法で、ナビゲーションバーのアニメーションと期間をカスタマイズできます。アニメーションが完了すると、コールバックが提供されます。

   // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion
    - (void)setNavigationBarVisible:(BOOL)visible animated:(BOOL)animated completion:(void (^)(BOOL))completion {

        // fail if the current state matches the desired state
        if ([self navigationBarIsVisible] == visible) return completion(YES);

        // get a frame calculation ready
        CGFloat nheight = self.navigationController.navigationBar.frame.size.height;
        CGFloat noffsetY = (visible)? -nheight : nheight;

        // zero duration means no animation
        CGFloat duration = (animated)? 0.3 : 0.0;

        [UIView animateWithDuration:duration animations:^{
            CGRect nframe = self.navigationController.navigationBar.frame;
            self.navigationController.navigationBar.frame = CGRectOffset(nframe, 0, noffsetY);
        } completion:completion];
    }

    // know the current state of the navigation bar
    - (BOOL)navigationBarIsVisible {
        return self.navigationController.navigationBar.frame.Origin.y < CGRectGetMinY(self.view.frame);
    }

    // Show or Hide navigation bar
    [self setNavigationBarVisible:![self navigationBarIsVisible] animated:YES completion:^(BOOL finished) {
        NSLog(@"navigation bar finished");
    }];

ナビゲーションバーを非表示にする前に:

Before hide a Navigation bar:

ナビゲーションバーを非表示にした後:

After hide a Navigation bar:

3
Vignesh Kumar