Frage

Ich habe den Code unten, dass verbirgt und zeigt die Navigationsleiste. Es ist versteckt, wenn die erste Ansicht lädt und dann ausgeblendet, wenn die „Kinder“ aufgerufen. Das Problem ist, dass ich nicht das Ereignis / Aktion finden kann, um es auszulösen wieder zu verstecken, wenn sie zurück in die Stammansicht bekommen ....

Ich habe einen „Test“ auf der Stammseite, die manuell die Aktion tut, aber es ist nicht schön, und ich will es automatisch sein.

-(void)hideBar 
{
    self.navController.navigationBarHidden = YES;
}
-(void)showBar 
{       
    self.navController.navigationBarHidden = NO;
}
War es hilfreich?

Lösung

Die schönste Lösung, die ich gefunden habe, ist die folgend in den ersten View-Controller zu tun .

Objective-C

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

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

Swift

override func viewWillAppear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
} 

Dies wird die Navigationsleiste dazu führen, von links zu animieren in (zusammen mit der nächsten Ansicht), wenn Sie das nächste UIViewController auf dem Stapel schieben, und animiert weg nach links (zusammen mit der alten Ansicht), wenn Sie die Taste zurück-Taste auf dem UINavigationBar.

Bitte beachten Sie auch, dass diese nicht Methoden delegieren, Sie sind zwingende UIViewController der Umsetzung dieser Methoden und entsprechend die Dokumentation Du muss die Super-Implementierung ruft irgendwo in Ihrer Implementierung .

Andere Tipps

Ein weiterer Ansatz, den ich gefunden ist, einen Delegierten für die NavigationController einzustellen:

navigationController.delegate = self;

und verwenden setNavigationBarHidden in navigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController 
                    animated:(BOOL)animated 
{   
    // Hide the nav bar if going home.
    BOOL hide = viewController != homeViewController;
    [navigationController setNavigationBarHidden:hide animated:animated];
}

Einfache Möglichkeit, das Verhalten für jeden ViewController alle an einem Ort anpassen.

Ein leichtes zwicken ich auf den anderen Antworten machen musste ist nur die Bar in viewWillDisappear sichtbar machen, wenn der Grund, es verschwindet aufgrund eines Navigationspunktes ist darauf gedrückt wird. Dies liegt daran, dass die Ansicht aus anderen Gründen verschwinden kann.

Also habe ich nur die Latte sichtbar machen, wenn diese Ansicht ist nicht mehr die oberste Ansicht:

- (void) viewWillDisappear:(BOOL)animated
{
    if (self.navigationController.topViewController != self)
    {
        [self.navigationController setNavigationBarHidden:NO animated:animated];
    }

    [super viewWillDisappear:animated];
}

ich den Code setzen würde in den viewWillAppear Delegierten auf jeder Ansicht angezeigt werden:

Wie dies, wo Sie brauchen, es zu verbergen:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject hideBar];
}

Wie dieses, wo Sie brauchen, es zu zeigen:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject showBar];
}

in Swift 3:

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


override func viewWillDisappear(_ animated: Bool) {
    if (navigationController?.topViewController != self) {
        navigationController?.navigationBar.isHidden = false
    }
    super.viewWillDisappear(animated)
}

Die derzeit akzeptierte Antwort entspricht nicht das gewünschte Verhalten in der Frage beschrieben. Die Frage geht dahin, für die Navigationsleiste auf der Root-View-Controller versteckt werden, sondern sichtbar überall sonst, aber die akzeptierte Antwort verbirgt sich die Navigationsleiste auf einen bestimmten View-Controller. Was passiert, wenn eine andere Instanz des ersten View-Controller auf den Stapel geschoben wird? Es wird die Navigationsleiste verstecken, auch wenn wir nicht an der Wurzel-View-Controller suchen.

Stattdessen @Chad M. Strategie die UINavigationControllerDelegate der Verwendung ist gut, und hier ist eine komplette Lösung. Schritte:

  1. Subclass UINavigationController
  2. Implementieren Sie die -navigationController:willShowViewController:animated Methode zu zeigen, oder die Navigationsleiste auszublenden, basierend auf, ob sie die Wurzel-View-Controller zeigt
  3. die Initialisierungsmethoden Überschreiben Sie die UINavigationController Unterklasse als seine eigene Delegierten setzen

Komplette Code für diese Lösung kann in dieser Gist . Hier ist die navigationController:willShowViewController:animated Implementierung:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    /* Hide navigation bar if root controller */
    if ([viewController isEqual:[self.viewControllers firstObject]]) {
        [self setNavigationBarHidden:YES animated:animated];
    } else {
        [self setNavigationBarHidden:NO animated:animated];
    }
}

Nach mehrmaligen Versuchen ist hier, wie ich es bekam Arbeit für das, was ich wollte. Dies ist, was ich versuche. - Ich habe eine Ansicht mit einem Bild. und ich wollte das Bild geht vollen Umfang nutzen haben. - Ich habe einen Navigation-Controller mit zu einem tabBar. Also muss ich das auch verstecken. - Auch meine wichtigste Voraussetzung war nicht nur versteckt, sondern einen Fading-Effekt zu haben, während Ein- und Ausblenden

.

Dies ist, wie ich habe es funktioniert.

Schritt 1 - Ich habe ein Bild und Benutzer tippt auf diesem Bild einmal. Ich diese Geste erfassen und in die neue imageViewController schieben, deren Stellung im imageViewController, mag ich Vollbild haben.

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {  
NSLog(@"Single tap");
ImageViewController *imageViewController =
[[ImageViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];

godImageViewController.imgName  = // pass the image.
godImageViewController.hidesBottomBarWhenPushed=YES;// This is important to note. 

[self.navigationController pushViewController:godImageViewController animated:YES];
// If I remove the line below, then I get this error. [CALayer retain]: message sent to deallocated instance . 
// [godImageViewController release];
} 

Schritt 2 - All diese Schritte unten sind in den ImageViewController

Schritt 2.1 - In ViewDidLoad zeigen die navBar

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"viewDidLoad");
[[self navigationController] setNavigationBarHidden:NO animated:YES];
}

Schritt 2.2 - In viewDidAppear, eine Timer Aufgabe mit Verzögerung (ich habe es gesetzt für 1 Sekunde Verzögerung). Und nach der Verzögerung, fügt Effekt verblassen. Ich bin mit alpha Fading verwenden.

- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear");

myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}

- (void)fadeScreen
{
[UIView beginAnimations:nil context:nil]; // begins animation block
[UIView setAnimationDuration:1.95];        // sets animation duration
self.navigationController.navigationBar.alpha = 0.0;       // Fades the alpha channel of   this view to "0.0" over the animationDuration of "0.75" seconds
[UIView commitAnimations];   // commits the animation block.  This Block is done.
}

Schritt 2.3 - Unter viewWillAppear, fügt SingleTap Geste auf das Bild und das navBar durchscheinend machen.

- (void) viewWillAppear:(BOOL)animated
{

NSLog(@"viewWillAppear");


NSString *path = [[NSBundle mainBundle] pathForResource:self.imgName ofType:@"png"];

UIImage *theImage = [UIImage imageWithContentsOfFile:path];

self.imgView.image = theImage;

// add tap gestures 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];  
[self.imgView addGestureRecognizer:singleTap];  
[singleTap release];  

// to make the image go full screen
self.navigationController.navigationBar.translucent=YES;
}

- (void)handleTap:(UIGestureRecognizer *)gestureRecognizer 
{ 
 NSLog(@"Handle Single tap");
 [self finishedFading];
  // fade again. You can choose to skip this can add a bool, if you want to fade again when user taps again. 
 myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self  selector:@selector(fadeScreen) userInfo:nil repeats:NO];
 }

Schritt 3 - Endlich in viewWillDisappear, stellen Sie sicher das Zeug alle zurück zu setzen

- (void)viewWillDisappear: (BOOL)animated 
{ 
self.hidesBottomBarWhenPushed = NO; 
self.navigationController.navigationBar.translucent=NO;

if (self.navigationController.topViewController != self)
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

[super viewWillDisappear:animated];
}

Geben Sie meinen Kredit @ chad-m ‚s Antwort.

Hier ist die Swift-Version:

  1. Erstellen Sie eine neue Datei MyNavigationController.swift

import UIKit

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController == self.viewControllers.first {
            self.setNavigationBarHidden(true, animated: animated)
        } else {
            self.setNavigationBarHidden(false, animated: animated)
        }
    }

}
  1. Stellen Sie Ihre UINavigationController Klasse in Storyboard MyNavigationController MyNavigationController Das ist es!

Der Unterschied zwischen chad-m Antwort und meinem:

  1. Vererben von UINavigationController, so dass Sie Ihre RootViewController nicht verschmutzen.

  2. Verwendung self.viewControllers.first statt homeViewController, so dass Sie nicht tun dies 100 Mal für 100 UINavigationControllers in 1 Storyboard.

Falls jemand immer noch Probleme mit den schnell backswipe abgebrochen Fehlern als @fabb in der akzeptierten Antwort kommentiert.

Ich schaffe diese viewDidLayoutSubviews durch zwingende zu beheben, zusätzlich zu viewWillAppear/viewWillDisappear wie unten dargestellt:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.setNavigationBarHidden(false, animated: false)
}

In meinem Fall, merke ich, dass es ist, weil der Wurzel-View-Controller (wo nav versteckt ist) und die gedrückte View-Controller (nav gezeigt) hat verschiedene Statusleiste Stile (zB Dunkelheit und Licht ). Sobald Sie die backswipe starten Sie den View-Controller-Pop, wird es zusätzliche Statusleiste Farbanimation sein. Wenn Sie Ihren Finger, um den interaktiven Pop, abzubrechen, während die Statusleiste Animation nicht beendet ist ist die Navigationsleiste für immer weg!

Allerdings ist dieser Fehler nicht auftreten, wenn Statusleiste Stile beiden View-Controller die gleiche sind.

Wenn das, was Sie wollen, ist die Navigationsleiste vollständig in der Steuerung zu verstecken, eine viel sauberere Lösung ist, in den Root-Controller, so etwas wie:

@implementation MainViewController
- (void)viewDidLoad {
    self.navigationController.navigationBarHidden=YES;
    //...extra code on view load  
}

Wenn Sie ein Kind Blick in die Steuerung schieben, bleibt die Navigationsleiste versteckt; wenn Sie es angezeigt werden nur in dem Kind wollen, müssen Sie den Code hinzufügen für it(self.navigationController.navigationBarHidden=NO;) im viewWillAppear Rückruf Anzeigen und in ähnlicher Weise den Code für sie auf viewWillDisappear versteckt

Die einfachste Implementierung sein kann, haben nur jeder View-Controller festlegen, ob seine Navigationsleiste versteckt ist oder nicht in seiner viewWillAppear:animated: Methode. Der gleiche Ansatz funktioniert gut für das Verstecken / zeigen die Symbolleiste auch:

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

Hiding Navigationsleiste nur auf der ersten Seite kann auch durch Storyboard erreicht werden. Auf Storyboard, gehe zu Navigation Controller Szenen-> Navigationsleiste . Und wählen Sie ' Versteckt ' Eigenschaft aus dem Attributen Inspektoren . Dies wird Navigationsleiste verstecken ersten Viewcontroller starten, bis sein sichtbar für den erforderlichen Viewcontroller gemacht.

Die Navigationsleiste kann in dem Viewcontroller ViewWillAppear Rückruf sichtbar zurückgesetzt werden.

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}

Swift 4:

In der View-Controller Sie in der Navigationsleiste ausblenden möchten.

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

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
}

Durch diesen Code in Ihren Viewcontroller implementieren können Sie diesen Effekt erhalten  Eigentlich ist der Trick, die navigationbar verstecken, wenn die Steuerung gestartet wird

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

und die Navigationsleiste sichtbar machen, wenn der Benutzer die Seite verlassen zu tun dies ist viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top