黑条出现在导航栏下

有几个类似的问题没有得到答案,但隐约描述。 我已经将这个问题简化成一个非常薄的应用程序,并添加了详细的截图。 我会高度赞赏这个解决scheme!

唯一涉及的代码是一行添加到根VC的viewDidLoad 。 这一行的目的是使导航控制器不透明:

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

这个问题的关键信息是“标题1”在其导航项目中有提示而“标题2”没有提示

我有一个导航控制器的故事板,一个名为“Title1”的根VC,带有一个继续button,将第二个VC称为“Title2”

故事板


在这里按下button时:

预压


我得到这个奇怪的屏幕:

之后按


当按下(标题1)时,情况变得更糟(即:标题1的原始标签被推高,现在不再被看到):

回来之后

请任何人?

迟到的答案,但我偶然发现了这个问题今天发现你的问题,它还没有一个公认的答案呢。

从故事板中的提示视图控制器到非提示视图控制器,我得到这个错误。

我得到了和你一样的黑色条。

并解决:

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

这将切换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() } } 

它显示为UINavigationBar的半透明属性似乎与框架其他视图控制器搞砸了。

我会推荐以下的方法。

创build一个基本视图控制器,其他视图控制器将从其inheritance,如下所示,

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

其他视图控制器将inheritance上面的BaseViewController

//接口

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

//执行

 #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; } 

没有及时执行的其他视图控制器将照常工作,但是他们也需要从BaseViewControllerinheritance。

似乎Xcode在更改导航条高度时有一些问题,因为主控制器视图没有相应resize。

我find了一个解决scheme来做到这一点,不知道这是最好的…但它的工作。

只需在第一个视图控制器(带提示的控制器)中inheritanceviewWillAppearviewWillDisappear方法:

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

我没有把注意力集中在框架尺寸上(3.5英寸的iPhone框架尺寸),你必须计算这个尺寸,否则你可能会遇到一些问题。