2

我设法通过使用以下方法向导航栏添加了自定义背景:

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

这很好用,我可以看到标题和按钮。但是,当我向下钻取一层然后返回根目录时,按钮被隐藏,但标题仍然可见。导航栏图像似乎覆盖了按钮项。

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

有任何想法吗?

谢谢,

麦克风

4

5 回答 5

12

按照这里的描述,我建议在导航栏中添加一个类别。

@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
于 2009-09-16T12:29:36.057 回答
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 的解决方案,但是当酒吧在其他控制器中具有不同的风格时,它可能会出现一些小问题,无论如何,这都不是最好的选择。

希望它有所帮助,至少要了解为什么您正在做的事情不起作用,

于 2011-12-10T18:00:06.083 回答
1

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

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

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

于 2011-10-19T22:06:03.290 回答
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);
}

这个关于自定义 UINavigationBar 外观的完整演示 Xcode 项目也可能会有所帮助。

于 2011-02-13T09:54:53.603 回答
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];
于 2012-02-21T20:18:49.850 回答