Black bar appears under navigation bar

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

There are several similar questions which got no answers but were describe vaguely. I have reduced the problem into a very thin application, and added detailed screenshots. I would highly appreciate a solution for this!

The only involved code is one line added to viewDidLoad of the root VC. The purpose of this line is to make the navigation controller opaque:

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

A critical information for this question is that 'Title1' has a prompt in its navigation item, while 'Title2' has not prompt.

I have a storyboard with one navigation controller, one root VC called "Title1", with a segue button which takes to a second VC called "Title2"


When pressing the button here:


I'm getting this strange screen:


When pressing back (Title1), it gets worse (i.e.: the original label of Title1 was pushed up and now not being seen anymore!!!):

Anyone please??

回答1:

Late answer but I stumbled across this problem today and found your question and it doesn't have an accepted answer yet.

I got this error while going from a prompted viewController to a non prompted viewController in storyboard.

I got that black bar just like you.

And to fix:

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

This will remove the prompt instantly before switching viewcontroller.

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


回答2:

It appeared as translucent property of UINavigationBar appeared to be messed up with frame other view controllers.

I would recommend following approach.

Create a base view controller from which other view controllers will inherit as follows,

#import "BaseViewController.h"  @interface BaseViewController ()  @end  @implementation BaseViewController  - (void)viewDidLoad {     [super viewDidLoad];     self.navigationController.navigationBar.translucent = NO; } 

other view controllers will inherit above BaseViewController

// interface

#import <UIKit/UIKit.h> #import "BaseViewController.h"  @interface ViewController : BaseViewController  @end 

// implementation

#import "ViewController.h"  @implementation ViewController  - (void)viewWillDisappear:(BOOL)animated {     [super viewWillDisappear:animated];     // Here translucent property is enabled when the view is about to be disappeared.     // However note that, translucent property needs to be enabled only on those view controllers which has prompt set on their navigation items.     self.navigationController.navigationBar.translucent = YES; } 

Other view controllers without prompt implementation will work as usual however they also needs to inherit from BaseViewController.



回答3:

Seems like Xcode has some issues when changing the navigationBar height since main controller view is not resized accordingly.

I found a solution to do this, not sure it is the best... but it's working.

Just inherit your viewWillAppear and viewWillDisappear methods in your first view controller (the one with a prompt):

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

I didn't focus on frame size (it's for 3,5" iPhone frame sizes). You must calculate this size or you might have some issues with larger screens.



回答4:

The best way to solve this issue is setting the background of the window during push i.e,

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!