web-dev-qa-db-ja.com

iOS 8でビューがプッシュ/ポップされたときにナビゲーションバーを表示/非表示

こんにちは開発者仲間、

IOS 8の特定のユースケースに関する情報が見つからなかったことに驚いています。説明しましょう。ナビゲーションコントローラースタックがあります。プッシュされ、戻るには、このビューに表示されるナビゲーションバーが必要です(明らかに)。 iOS 7では、viewWillAppearに次の行を追加するだけでした。

 [self.navigationController setNavigationBarHidden:NO animated:YES];

そして、それは魅力のように機能します。しかし、iOS 8の時点で、私は同じ動作をするのに苦労しています。今のところ、私は以下を使用して同じことを行うことができました:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
        [self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void)viewDidLoad {
     [super viewDidLoad];
     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
         self.automaticallyAdjustsScrollViewInsets = NO;
         self.edgesForExtendedLayout = UIRectEdgeNone;
         self.collectionView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height, 0, 0, 0);
}    }

そして、私が表示する必要があるものは何でも、私のcollectionsView/tableviewsのcontentInsetを変更します。それは動作しますが、*での苦痛です(ユーザーが新しいViewControllerから来た場合、コンテンツのインセットは必要ない場合があります)。

コンテキストのために、プロジェクトは最初にiOS 6および7を処理するために開発されたため、ストーリーボードはなく、すべてプログラムで行われます。私はアプリをより新しいコードベースに移植し、ユニバーサルにしました。

私は何かが欠けていますか? iOS 7/8でそれを処理するより良い方法はありますか?

22
nebuto

viewWillAppearで非表示にし、viewWillDisappearで再び表示したい

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.isHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.navigationBar.isHidden = false
}
13
Nick Wargnier

これをアニメーション化して、スムーズな移行を実現します。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}
10
Patrick Haaser

私はラインがだと思った:

self.navigationController.navigationBar.hidden = YES;

私はそれをチェックし、それは私のためにうまく機能しています。 。 。それを試してみてください 。 。 。

9
iHart

iOS 8では、navigationBarHiddennavigationBar.hiddenと同じではないようです。 (私は展開ターゲットiOS 6で構築しています-これが違いを生むかどうかわかりません)。

私のコードでは、次のconsecutive行でデバッガーを見ています:

bool b1 = self.navigationController.navigationBarHidden; // FALSE

bool b2 = self.navigationController.navigationBar.hidden; // TRUE

b1はfalse、b2はtrueとして表示されます。

self.navigationController.navigationBar.hidden = falseを設定すると問題が解決します

7
de-bits

私は同じ問題を抱えていて、実際にすべてを試しましたが、ナビゲーションバーは表示されませんでした。最後に、最初のView Controllerにこのコードがあることに気付きました:-)

[self.navigationController setNavigationBarHidden:YES];

この質問をチェックする他の誰かが私の間違いをしたと思ったので、言及する価値があると思いました。

4

複数のテクニックがあります。摩擦が少ないのは:

open class ViewController: UIViewController {
  open var hidesNavigationBarWhenPushed = false

  override open func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(hidesNavigationBarWhenPushed, animated: animated)
  }
}

しかし、それはあなたにこれを与えるでしょう result

または、新しく構築した HidesNavigationBarWhenPushedライブラリ を使用することをお勧めします。 ここに説明があります それがどのように機能し、なぜ私がそれを構築したのか。

0
gontovnik