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?
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
}
Ich dachte Linie ist:
self.navigationController.navigationBar.hidden = YES;
Ich überprüfe es und es funktioniert gut für mich. . .Versuch es . . .
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];
}
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
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.
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.