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