UINavigationBar问题的自定义背景

时间:2009-09-16 12:14:57

标签: iphone uinavigationbar uibarbuttonitem uinavigationitem

我设法使用以下方法将自定义背景添加到导航栏:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

这很好用,我可以看到标题和按钮没问题。但是,当我向下钻取一个级别然后返回到根时,按钮将被隐藏,但标题仍然可见。导航栏图像显示为覆盖按钮项目。

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

有什么想法吗?

谢谢,

麦克

5 个答案:

答案 0 :(得分:12)

根据here的说明,我建议在导航栏中添加一个类别。

@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

答案 1 :(得分:1)

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

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

注意:这仅适用于iOS 5及更高版本,因此如果您想向后兼容,请务必检查iOS版本。

答案 2 :(得分:1)

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

你可以尝试在viewDidAppear中添加它(在每个管理导航项/的视图控制器中:):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

我使用了Hauek's解决方案但是当其他控制器中的条形图有不同的味道时,它可能会产生一些小问题,无论如何,这不是最好的选择。

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

答案 3 :(得分:0)

您可以在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);
}

This complete demo Xcode project关于自定义UINavigationBar的外观可能也会有所帮助。

答案 4 :(得分:0)

接下来,您只需向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];