2013-09-27 72 views
7

我按照下面的教程向下移动我的导航栏,以便它不是在Xcode 5/ios7覆盖的状态栏:让后面的状态栏导航栏伸展在Xcode 5/iOS7

Status bar and navigation bar issue in IOS7

但是现在在iOS7的顶部会有一个空白的状态栏,我希望导航栏也可以填充这个区域

例如,Facebook/twittter/Instagram iOS7应用程序具有导航栏背景也在状态栏后面。我如何实现这一目标?

很抱歉,如果我不是清楚,但真正渴望得到这个整理

谢谢!

+0

您是否使用自定义导航栏或内置? –

回答

0

如果想舒展与UIStatusBar iOS中后面的自定义背景图像的UINavigationBar的7考虑以下因素:

  1. 的UIStatusBar是透明的,因为它是。
  2. 设置UINavigationBar的对barPosition财产UIBarPositionTopAttached
  3. 在IOS 7(如果UIBarPositionTopAttached)比之前的iOS的7种不同尺寸的UINavigationBar的背景图像,你必须使用它们:现在高度是64点

在代码(iPhone只):

// Image needs 64 points height 
NSString* navBarPortraitBackgroundPath = [[NSBundle mainBundle] pathForResource:@"navBarPortraitBackground" ofType:@"png"]; 
NSString* navBarLandscapeBackgroundPath; 


if(UIScreen.mainScreen.bounds.size.height == 568){ 

    // Image needs 64 points height 
    navBarLandscapeBackgroundPath = [[NSBundle mainBundle] pathForResource:@"navBarWideLandscapeBackground" ofType:@"png"]; 

} else { 

    // Image needs 64 points height 
    navBarLandscapeBackgroundPath = [[NSBundle mainBundle] pathForResource:@"navBarLandscapeBackground" ofType:@"png"]; 

} 


[[UINavigationBar appearance] setBackgroundImage:[UIImage imageWithContentsOfFile:navBarPortraitBackgroundPath] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault]; 
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageWithContentsOfFile:navBarLandscapeBackgroundPath] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsLandscapePhone]; 

如果您只想更改为UINavigationBar的背景颜色,它将自动延伸到UIStatusBar的后面。

代码:

[UINavigationBar appearance].barTintColor = [UIColor redColor]; 
+6

您可能想要解释如何实际设置barPosition。 – weienw

+0

barPosition是只读的 – jjxtra

21

你要设置的UINavigationBarbarPosition

您可以在代码中做到这一点:

让你的ViewController符合协议UINavigationBarDelegate和实施positionBar:梅托德。 (你确实需要的协议是UIBarPositioningDelegateUINavigationBarDelegate并扩展它。)

@interface SampleViewController() <UINavigationBarDelegate> 
@property (weak, nonatomic) IBOutlet UINavigationBar *navigationBar; 
@end 

@implementation SampleViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _navigationBar.delegate = self; 
} 

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { 
    return UIBarPositionTopAttached; 
} 
@end 

或情节提要:

UINavigationBar身份检查,添加一个用户自定义运行属性与的keyPath = barPosition ,类型=数字,和值= 3:

Add User Defined Runtime Attribute

+9

非常感谢您向我学习用户定义的运行时属性菜单。这是我对地球的震撼。我永远不会继承ui元素来再次更改一个属性。 – lol

+0

有趣的发现在这里,但它不适合我。我总是得到以下错误:“***由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'无法手动设置在由控制器管理的UINavigationBar上的委托'。”如果我重写UINavigationViewController并将其添加到那里,没有得到一个错误,但它也不工作... –

+0

@lol我只是希望你是讽刺,OO这不是你应该养成的习惯。它可以很快成为调试的噩梦。 – TheCodingArt