2014-01-12 14 views
7

Es gibt mehrere ähnliche Fragen, die keine Antworten erhielten, aber vage beschrieben wurden. Ich habe das Problem in eine sehr dünne Anwendung reduziert und detaillierte Screenshots hinzugefügt. Ich würde eine Lösung dafür sehr schätzen!Schwarzer Balken erscheint unter Navigationsleiste

Der einzige beteiligte Code ist eine Zeile hinzugefügt ViewDidLoad der Wurzel VC. Der Zweck dieser Linie ist die Navigationssteuerung undurchsichtig zu machen:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationController.navigationBar.translucent = NO; 
} 

Eine kritische Informationen für diese Frage ist, dass ‚Title1‘ eine prompte in seiner Navigationspunkt hat, während ‚Title2‘ hat nicht aufgefordert .

Ich habe ein Storyboard mit einer Navigationssteuereinrichtung, einem VC Wurzel genannt „Title1“ mit einer segue Taste, die zu einem zweiten VC nimmt als „Title2“

storyboard


Beim Drücken der hier Taste:

pre press


Ich erhalte diesen seltsamen Bildschirm:

after press


Beim Drücken zurück (Title1), es wird noch schlimmer (dh: das Originaletikett von Title1 wurde nach oben gedrückt wird und jetzt nicht mehr gesehen zu werden !! !):

after back

Wer bitte ??

+0

Was ist prompt1 hier? – ldindu

+0

Es ist die Eingabeaufforderung des Navigationselements – ishahak

+0

ist es ein Titel des Navigationselements? – ldindu

Antwort

2

Späte Antwort, aber ich stolperte über dieses Problem heute und fand Ihre Frage und es hat noch keine akzeptierte Antwort.

Ich habe diesen Fehler beim Wechseln von einem auffordernden viewController zu einem nicht angeforderten viewController im Storyboard.

Ich habe diesen schwarzen Balken genau wie Sie.

Und zu beheben:

// In prompted vc 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    UIView.setAnimationsEnabled(false) 
    self.navigationItem.prompt = nil 
    UIView.setAnimationsEnabled(true) 
} 

Dies wird die Aufforderung sofort vor dem Einschalten Viewcontroller entfernen.

UPDATE

func prompt() -> String? { 
    return nil 
} 

override func viewWillAppear(animated: Bool) { 
    let action = { self.navigationItem.prompt = self.prompt() } 

    if self.navigationController?.viewControllers.count <= 1 { 
     UIView.performWithoutAnimation(action) 
    } 
    else { 
     action() 
    } 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {   
    UIView.performWithoutAnimation { 
     self.navigationItem.prompt = (segue.destinationViewController as? ViewController)?.prompt() 
    } 
} 
+0

Das funktioniert nur, wenn Sie zu einer anderen Ansicht wechseln. Im Falle einer Navigationsleiste und der Zurück-Schaltfläche wird kein Segment ausgeführt. Versucht, diesen Code in Aussicht zu setzenWillDisappear ohne Glück – lostintranslation

+0

@lostintranslation Thats, weil Sie es in 'viewWillAppear' in der VC setzen müssen, unterstützen Sie. Ich werde meine Antwort aktualisieren – Arbitur

1

Scheint, dass Xcode einige Probleme hat, wenn die Höhe der navigationBar geändert wird, da die Ansicht des Hauptcontrollers nicht entsprechend angepasst wird.

Ich fand eine Lösung, dies zu tun, nicht sicher, dass es das beste ist ... aber es funktioniert.

einfach Ihre viewWillAppear und viewWillDisappear Methoden in Ihrem ersten View-Controller erben (die mit einer Eingabeaufforderung):

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    self.navigationItem.prompt = @"Prompt1"; 

    [UIView animateWithDuration:UINavigationControllerHideShowBarDuration 
          delay:0.0 
         options: UIViewAnimationOptionCurveEaseOut 
        animations:^{ 
         [self.view setFrame:CGRectMake(0, 94, 320, 386)]; 
        } 
        completion:^(BOOL finished){ 
        }]; 

} 

- (void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    // Sets prompt to nil 
    self.navigationItem.prompt = nil; 

    [UIView animateWithDuration:UINavigationControllerHideShowBarDuration 
          delay:0.0 
         options: UIViewAnimationOptionCurveEaseOut 
        animations:^{ 
         [self.view setFrame:CGRectMake(0, 64, 320, 416)]; 
        } 
        completion:^(BOOL finished){ 
        }]; 
} 

ich nicht auf Rahmengröße hat konzentrieren (es ist für 3,5" iPhone Rahmengrößen) . Sie müssen diese Größe berechnen oder Sie könnten einige Probleme mit größeren Bildschirmen.

+0

Hi @Damien, wirklich Ihre Lösung zu schätzen. Die echte Anwendung hat viele Bildschirme, so dass es sicherlich keine ordentliche Lösung, so dass ich warten werde, um zu sehen, ob es eine bessere – ishahak

3

Es wird als durchscheinend Eigenschaft UINavigationBar erschienen erschien mit Rahmen anderer Ansicht-Controller vermasselt werden.

ich würde empfehlen, fo lowing Ansatz.

einen Controller Basis Ansicht erstellen, von denen andere Ansicht-Controller erben werden wie folgt

#import "BaseViewController.h" 

@interface BaseViewController() 

@end 

@implementation BaseViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationController.navigationBar.translucent = NO; 
} 

andere Ansicht Controller oben BaseViewController erben

// Schnittstelle

#import <UIKit/UIKit.h> 
#import "BaseViewController.h" 

@interface ViewController : BaseViewController 

@end 

// Umsetzung

Andere View-Controller ohne Prompt-Implementierung funktionieren wie gewohnt, müssen jedoch auch von BaseViewController erben.

+0

Vielen Dank @Idindu. Ich muss deine Herangehensweise überprüfen, bin mir aber nicht sicher, ob ich dir folge. Für meine App, auch ohne eine Eingabeaufforderung, muss die Transluzenz auf NEIN eingestellt werden, da ich den Inhalt unter der Navigationsleiste anzeigen muss. – ishahak

+0

Ja, ich setze nur NO, für den View-Controller, dessen Prompt gesetzt ist, wann Der View-Controller wird bald verschwinden, da er jedoch erneut in BaseViewController festgelegt wird, von dem andere View-Controller erben werden. – ldindu

+0

setting navigationController.navigationBar.isTranslucent = true war das Update, das für mich funktionierte – Tinkerbell

0

Der beste Weg, um dieses Problem zu lösen, ist der Hintergrund des Fensters während Push d.h Einstellung

let appdelegate = UIApplication.shared.delegate as! AppDelegate 
appdelegate.window?.backgroundColor = UIColor.white 
Verwandte Themen