xcode iPhone中的UI导航栏背景
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1381145/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
UINavigation bar background in iPhone
提问by Sagar R. Kothari
I have applied following code to my application to change the navigation bar image.
我已将以下代码应用于我的应用程序以更改导航栏图像。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController.navigationBar setTintColor:[UIColor blackColor]];
[self setNavigationBarTitle];
}
-(void)setNavigationBarTitle {
UIView *aViewForTitle=[[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 45)] autorelease];
UIImageView *aImg=[[UIImageView alloc] initWithFrame:CGRectMake(-8, 0, 320, 45)];
aImg.image=[UIImage imageNamed:@"MyTabBG.png"];
[aViewForTitle addSubview:aImg]; [aImg release];
UILabel *lbl=[[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 305, 45)] autorelease];
lbl.backgroundColor=[UIColor clearColor]; lbl.font=[UIFont fontWithName:@"Trebuchet MS" size:22];
lbl.shadowColor=[UIColor blackColor]; [lbl setShadowOffset:CGSizeMake(1,1)];
lbl.textAlignment=UITextAlignmentCenter; lbl.textColor=[UIColor whiteColor]; lbl.text=@"Mobile Tennis Coach Overview";
[aViewForTitle addSubview:lbl];
[self.navigationItem.titleView addSubview:aViewForTitle];
}
See following images. You can see the problem that I am facing.
请参阅以下图片。你可以看到我面临的问题。

Each view controller of my application has above methods to set the navigation bar background.
我的应用程序的每个视图控制器都有上述方法来设置导航栏背景。
How ever, when I push a new view controller to my application. Back button will be appear.
但是,当我将新的视图控制器推送到我的应用程序时。将出现返回按钮。
I need back button to be appear. But The image should be behind back button.
我需要出现后退按钮。但是图像应该在后退按钮后面。
Now I am little confused here.
现在我在这里有点困惑。
Can you help me regarding this?
你能帮我解决这个问题吗?
Thanks in advance for sharing your knowledge with me.
预先感谢您与我分享您的知识。
Thanks a lot.
非常感谢。
采纳答案by ljonesATL
After an annoying night, I found a slight tweak to this, if you use drawLayer. With drawRect, when you play a video, or youtube video, the navbar is replaced with the image. And I read a few posts that this caused their app to be rejected.
经过一个烦人的夜晚,如果您使用 drawLayer,我发现对此稍作调整。使用 drawRect,当您播放视频或 YouTube 视频时,导航栏将替换为图像。我读了一些帖子说这导致他们的应用程序被拒绝。
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
if([self isMemberOfClass:[UINavigationBar class]])
{
UIImage *image = [UIImage imageNamed:@"navBarBackground.png"];
CGContextClip(ctx);
CGContextTranslateCTM(ctx, 0, image.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextDrawImage(ctx,
CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}
else
{
[super drawLayer:layer inContext:ctx];
}
}
@end
If this article is accurate, all should be fine with this approach: http://developer.apple.com/iphone/library/qa/qa2009/qa1637.html
如果这篇文章是准确的,那么这种方法应该没问题:http: //developer.apple.com/iphone/library/qa/qa2009/qa1637.html
回答by Marcus S. Zarra
The short answer is that modifying the structure of the UINavigationBar is not supported by Apple. They really do not want you do be doing what you are trying to do. That is what is causing the issue you are seeing.
简短的回答是 Apple 不支持修改 UINavigationBar 的结构。他们真的不希望你做你想做的事情。这就是导致您看到的问题的原因。
Please file a radar requesting this feature so that it can get enough attention to be officially added at some point.
请提交请求此功能的雷达,以便它可以得到足够的关注,以便在某个时候正式添加。
Having said that, to solve the issue you can add a category to UINavigationBar with a -drawRect: method and draw the background image in that method. Something like this will work:
话虽如此,为了解决这个问题,您可以使用 -drawRect: 方法向 UINavigationBar 添加一个类别,并在该方法中绘制背景图像。像这样的事情会起作用:
- (void)drawRect:(CGRect)rect
{
static UIImage *image;
if (!image) {
image = [UIImage imageNamed: @"HeaderBackground.png"];
if (!image) image = [UIImage imageNamed:@"DefaultHeader.png"];
}
if (!image) return;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}