Ios UINavBar覆盖状态栏并重复背景自定义图像

Ios UINavBar覆盖状态栏并重复背景自定义图像,ios,objective-c,uinavigationcontroller,Ios,Objective C,Uinavigationcontroller,我正在将应用程序从iOS 4.3更新到iOS 7,我无法修复一个问题。我在网上做了很多搜索,但运气不好。也有类似的问题,但对我不起作用: 我不使用故事板,我使用xib文件。 我在导航控制器中嵌入了视图控制器,在选项卡栏控制器中嵌入了视图控制器。 我在didFinishLaunchingWithOptions:方法中添加我的视图,如下所示: HomeViewController *homeViewController = [[HomeViewController alloc] init

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

我不使用故事板,我使用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];
要添加自定义背景图像,我使用代码(仍然使用相同的方法):

我尝试添加UINavigationBarDelegate和:

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
    return UIBarPositionTopAttached;
}
视图中控制器的名称:

self.navigationController.navigationBar.delegate = self;
出现以下错误:

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

您知道如何解决此问题,使导航栏布局位于顶部而不覆盖状态栏吗

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

我使用的一种方法是:

    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];

@viewDidLoad中的iDev我添加了日志NSLog(@“FRAME:%@”,NSStringFromCGRect(self.navigationController.navigationBar.FRAME));显示为44。我将应用程序从iOS4更新到iOS7,但我仍然希望支持ios6(6及以上)。您将导航栏大小设置为320*64。由于导航栏与状态栏44+20=64I合并,因此可以将图像大小调整为64,但仍将覆盖状态栏。
    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];