2014-01-12 38 views
7

有几个类似的问题没有得到答案,但被隐约描述。我已经将问题简化为一个非常薄的应用程序,并添加了详细的屏幕截图。我非常感谢这个解决方案!黑条出现在导航条下

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

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

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

我有一个导航控制器,一个被称为“标题1”根VC一个情节串连图板,具有赛格瑞按钮这需要到被称为“标题2”

storyboard


当按下第二VC按钮的位置:

pre press


我得到这个奇怪的画面:

after press


当按下背面(标题1),它会变得更糟(即:标题1的原标签被推了,现在没有再见过! !):

after back

请人?

+0

什么是PROMPT1这里? – ldindu

+0

这是导航项的提示 – ishahak

+0

它是导航项的标题吗? – ldindu

回答

2

最后回答,但我今天偶然发现了这个问题,发现你的问题,但它还没有一个可接受的答案呢。

我从故事板中的提示视图控制器转到非提示视图控制器时出现此错误。

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

并修复:

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

,会立刻切换视图 - 控制之前删除的提示。

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

这只适用于如果您延续到另一个视图。在导航栏和后退按钮的情况下,不执行segue。试图将该代码放在视图中将会失去效果 – lostintranslation

+0

@lintintranslation那是因为你需要把它放到VC中的'viewWillAppear'中。生病更新我的答案 – Arbitur

1

似乎Xcode在更改navigationBar高度时有一些问题,因为主控制器视图并未相应调整大小。

我发现了一个解决方案来做到这一点,不知道它是最好的...但它的工作。

只是继承你的第一个视图控制器(带有提示)您viewWillAppearviewWillDisappear方法:

- (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外形尺寸)你必须计算这个尺寸或者你可能有一些问题,更大的屏幕。

+0

嗨@Damien,真的很欣赏你的解决方案。真正的应用程序有很多屏幕,所以它肯定不是一个整洁的解决方案,所以我会等待看看是否有更好的屏幕出现 – ishahak

3

看来UINavigationBar的作为透光性似乎是搞砸了与其他框架视图控制器。

我会建议FO放松的方法。

创建从其它视图控制器将继承如下基本视图控制器,

#import "BaseViewController.h" 

@interface BaseViewController() 

@end 

@implementation BaseViewController 

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

其它视图控制器将继承以上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; 
} 

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

+0

谢谢@Idindu。我需要检查你的方法,但不知道我跟着你。对于我的应用程序,即使没有提示,半透明性也必须设置为NO,因为我需要将内容显示在导航栏的下方 – ishahak

+0

是的,我只是将其设置为NO,视图控制器即将消失,但是由于它在BaseViewController中再次设置,其他视图控制器将继承它。 – ldindu

+0

设置navigationController.navigationBar.isTranslucent = true是为我工作的修复程序 – Tinkerbell

0

来解决这个问题是设置窗口的推即在背景的最好办法,

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