Iphone UINavigationBar问题的自定义背景

Iphone UINavigationBar问题的自定义背景,iphone,uinavigationbar,uibarbuttonitem,uinavigationitem,Iphone,Uinavigationbar,Uibarbuttonitem,Uinavigationitem,我已通过以下方式将自定义背景添加到导航栏: UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]]; [myViewController.navigationBar insertSubview:iv atIndex:0]; [iv release]; 这很好,我可以看到标题和按钮。但是,当我向下钻取一层,然后返回到根目录时,按钮被隐藏,但标题仍然可见。导航

我已通过以下方式将自定义背景添加到导航栏:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];
这很好,我可以看到标题和按钮。但是,当我向下钻取一层,然后返回到根目录时,按钮被隐藏,但标题仍然可见。导航栏图像似乎覆盖了按钮项

我很困惑,因为我正在底部插入它,所以我会假设当导航项被按下并弹出时,它们会显示在导航栏中其他视图的上方

有什么想法吗

谢谢


Mike

根据中的描述,我建议在导航栏中添加一个类别

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end
您可以在UINavigationBar类别中重写drawLayer:inContext:方法,而不是在drawRect:中执行此操作。在drawLayer:inContext:方法中,可以绘制要使用的背景图像。如果你的应用程序支持多个界面方向,你也可以为纵向和横向界面方向选择不同的图像

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

定制UINavigationBar的外观可能也会有所帮助。

在iOS 5上,这不会起作用,但好消息是,有一种简单的方法可以做到这一点

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

注意:这只适用于iOS 5及更高版本,因此如果您希望向后兼容,请确保检查iOS版本。

导航栏的子视图不断变化,我的意思是每个视图都会出现/消失,因此您不应该期望在子视图数组的索引0处添加imageview

您可以尝试在ViewDidDisplay(在管理导航项的每个viewcontroller/:)中添加此项:

我用过这个解决方案,但当酒吧在其他控制器中有不同的味道时,可能会出现一些小问题,无论如何,这都不是最好的选择


希望它能有所帮助,至少要理解为什么你所做的事情不起作用,

下一步就是简单地向UINavigationBar添加一个新的背景

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];

谢谢你!它的工作,除了它似乎是导航栏添加了一个黑暗到光明的图像顶部梯度!有没有办法消除这种效果?事实上,它似乎是把PNG画颠倒了!?有什么想法吗?啊,明白了。。。您需要使用[img drawInRect:CGRectMake(0,0320,self.frame.size.height)];而不是CGContextDrawImage()!您可以将上述代码添加到appdelegate.m文件的底部。只是提到这一点,因为我没有通过谷歌搜索得到它。@Michael瀑布[img drawInRect:rect];
/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];