web-dev-qa-db-ger.com

Navigationsleiste anzeigen/ausblenden, wenn die Ansicht in iOS 8 gedrückt wird

Hallo Mitentwickler,

Ich bin überrascht, dass ich keine Informationen zu diesem speziellen Anwendungsfall für iOS 8 gefunden habe. Lassen Sie mich erklären, dass ich einen Navigations-Controller-Stack habe. Die erste Ansicht hat die Navigationsleiste ausgeblendet, wenn der Benutzer auf eine Zelle eine neue Ansicht klickt wird gedrückt und ich brauche die Navigationsleiste, die in dieser Ansicht angezeigt wird, um (offensichtlich) zurückzukehren. Unter iOS 7 mussten Sie lediglich diese Zeile in viewWillAppear hinzufügen:

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

Und es funktioniert wie ein Zauber. Aber seit iOS 8 habe ich Schwierigkeiten, das gleiche Verhalten zu haben. Im Moment habe ich es geschafft, dasselbe zu tun, indem ich

- (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);
}    }

Und ich ändere das contentInset meiner CollectionsView/Tableviews, was immer ich anzeigen muss. Es wird funktionieren, aber es ist ein echter Schmerz im * (manchmal ist der Inhalt nicht erforderlich, wenn der Benutzer von einem neuen Viewcontroller kommt).

Für den Kontext wurde das Projekt zuerst für iOS 6 und 7 entwickelt. Daher wird kein Storyboard programmiert. Ich portierte die App auf eine modernere Codebase und machte sie universell.

Fehlt mir etwas? Gibt es in iOS 7/8 einen besseren Weg, damit umzugehen?

21
nebuto

Sie möchten es in viewWillAppear ausblenden und erneut in viewWillDisappear anzeigen.

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

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

Ich dachte Linie ist:

self.navigationController.navigationBar.hidden = YES;

Ich überprüfe es und es funktioniert gut für mich. . .Versuch es . . .

9
iHart

Tun Sie dies animiert, um einen reibungslosen Übergang zu erhalten:

- (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];
}
8
Patrick Haaser

Bei iOS 8 scheint es, dass navigationBarHidden nicht dasselbe ist wie navigationBar.hidden. (Ich baue mit dem Implementierungsziel iOS 6 - nicht sicher, ob dies einen Unterschied macht).

Betrachte in meinem Code den Debugger mit folgenden aufeinanderfolgenden Zeilen:

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

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

b1 wird als falsch und b2 als wahr angezeigt.

Das Setzen von self.navigationController.navigationBar.hidden = false löst das Problem

7
de-bits

Ich hatte das gleiche Problem und habe wirklich alles versucht, aber die Navigationsleiste wurde nicht angezeigt. Endlich wurde mir klar, dass ich diesen Code in meinem ersten View-Controller hatte :-)

[self.navigationController setNavigationBarHidden:YES];

Ich dachte, jemand anderes, der diese Frage prüft, hat meinen Fehler gemacht, also dachte ich, dass es sich lohnt zu erwähnen.

4

Es gibt mehrere Techniken. Die weniger Reibung wäre: 

open class ViewController: UIViewController {
  open var hidesNavigationBarWhenPushed = false

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

Aber das würde Ihnen dieses Ergebnis geben.

Alternativ würde ich vorschlagen, meine neu gebaute HidesNavigationBarWhenPushed-Bibliothek zu verwenden. Hier ist die Erklärung wie es funktioniert und warum ich es gebaut habe.

0
gontovnik