ION NavBar覆盖状态栏并重复后台自定义图像

时间:2014-01-30 12:06:53

标签: ios objective-c uinavigationcontroller

我正在将应用从iOS 4.3更新到iOS 7,我无法解决一个问题。我在网上做了很多搜索,但没有运气。有类似的问题,但它对我不起作用:

link 1 link 2

我不使用故事板,我使用xib文件。 我有嵌入在标签栏控制器中的导航控制器中的视图控制器。 我在didFinishLaunchingWithOptions:这样的方法中添加我的观点:

    HomeViewController *homeViewController = [[HomeViewController alloc] init];
    homeViewController.tabBarItem.image = [UIImage imageNamed:@"home.png"];
    homeViewController.tabBarItem.title = NSLocalizedString(@"Home", @"Home");
    UINavigationController *homeNavController = [[UINavigationController alloc] initWithRootViewController:homeViewController];
    homeNavController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
    //...other views
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:homeNavController, ..., nil];

要添加自定义背景图片,我使用代码(仍采用相同的方法):

    [[UINavigationBar appearance] setTintColor:UIColorFromRGB(0xFFA722)];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"Logo.png"] forBarMetrics:UIBarMetricsDefault];

我尝试添加UINavigationBarDelegate和:

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

但是当我设置委托时,我尝试以两种方式进行:

//在didFinishLaunchingWithOptions

homeNavController.navigationBar.delegate = self;
视图控制器中的

self.navigationController.navigationBar.delegate = self;

出现错误:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'无法手动设置   委托由控制器管理的UINavigationBar。'

您知道如何解决此问题,让导航栏布局在顶部没有覆盖状态栏吗?

另一个问题是,我的应用程序中有大小为320x44的图像徽标和视网膜版本640x88正在重复图像。 为什么它像导航栏那样具有确切的大小? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我使用的一种方式:

    UIView *navBar = nil;
    [_customBar removeFromSuperview];
    _customBar = nil;
    //
    CGFloat width = self.view.frame.size.width; // 320px
    CGFloat height = 110.0f;
    // subview height
    navBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    [navBar setBackgroundColor:[UIColor blueColor]];
    // redefine bar height
    UINavigationBar *currentNavBar = self.navigationController.navigationBar;
    CGRect frame = [currentNavBar frame];
    frame.size.height = height;
    frame.origin.x = 0.0f;
    [currentNavBar setFrame:frame];
    _normalBar = (UINavigationBar*) navBar;
    // ******************************
    // add your custom view to navBar
    // ******************************
    _normalBar = (UINavigationBar*) navBar;
    [self.navigationController.navigationBar addSubview:navBar];

不要忘记恢复原来的栏:

[_normalBar removeFromSuperview];
_normalBar = nil;
CGRect frame =  self.navigationController.navigationBar.frame;
frame.size.height = 44.0f;
[self.navigationController.navigationBar setFrame:frame];