如何在导航栏上显示背景图像或在本机 iphone 应用程序中为导航栏提供色调?
7 回答
对于 iOS5,使用以下代码行:
UINavigationBar *navBar = [[self navigationController] navigationBar];
UIImage *backgroundImage = [UIImage imageNamed:@"nav-bar-background-normal"];
[navBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
为了向后兼容,请检查导航栏是否响应 setBackgroundImage:forBarMetrics:
更多信息: http ://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/
This's how I did on iOS4:
#import <QuartzCore/QuartzCore.h> // For .layer
self.navigationController.navigationBar.layer.contents = (id)[UIImage imageNamed:@"navigationBarBackgroundImage"].CGImage;
self.navigationController.navigationBar.tintColor = [UIColor orangeColor];
No need to switch subviews between z-orders (-exchangeSubviewAtIndex:withSubviewAtIndex:), both background image and tintColor set in one line of code, and works with @2x image too.
一周前正在寻找这个。在这里的讨论中找到了这个。苹果。com/thread.jspa?threadID=1649012&tstart=0 (抱歉不会让我发布真正的链接)。
-(void)setBackgroundImage:(UIImage*)image withTag:(NSInteger)bgTag{
if(image == NULL){ //might be called with NULL argument
return;
}
UIImageView *aTabBarBackground = [[UIImageView alloc]initWithImage:image];
aTabBarBackground.frame = CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
aTabBarBackground.tag = bgTag;
[self addSubview:aTabBarBackground];
[self sendSubviewToBack:aTabBarBackground];
[aTabBarBackground release];
}
/* input: The tag you chose to identify the view */
-(void)resetBackground:(NSInteger)bgTag {
[self sendSubviewToBack:[self viewWithTag:bgTag]];
}
我把它作为 UINavigationBar 的一个类别。要将其设置为 UINavigationBarController 内的 UINavigationBar 的背景图像,我这样做了:
[navigationControllerForChannels.navigationBar setBackgroundImage:[UIImage imageNamed:@"top_bar.png"] withTag:48151623];
我在更新标签栏时遇到了一些问题,所以你需要打电话
[self.navigationController.navigationBar resetBackground:48151623];
任何修改后吧。
您可以覆盖 UINavigationBar drawRect。该代码可以放置到 appDelegate.m 我已经测试过它,它可以在 3x 和 4x iOS 上运行。
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
UIColor *color = [UIColor blackColor]; //tint color
UIImage *img = [UIImage imageNamed: @"navBarBg.png"]; // your image
[img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
self.tintColor = color;
}@end
对于 iOS5 和 iOS6,我使用了这个解决方案,并且效果很好,制作了一个通用 UINavigationBar 背景图像。
iPhone 视网膜纵向 640px x 88px / iPhone 非视网膜纵向 320px x 44px
AppDelegate.m 内部
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
放置此代码
// Set the status bar to black color.
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
// Change @"menubar.png" to the file name of your image.
UIImage *navBar = [UIImage imageNamed:@"menubar.png"];
[[UINavigationBar appearance] setBackgroundImage:navBar forBarMetrics:UIBarMetricsDefault];
不要忘记更改图像名称(menubar.png)
查看此链接以获取完整答案http://www.lwxted.com/blog/2012/add-custom-background-image-uinavigationbar-ios-5/
背景图像将需要更多工作(您可能想尝试设置与栏本身大小相同的titleView;我自己没有尝试过)或在现有子视图后面添加一个视图。着色很简单:navBar.tintColor = [UIColor orangeColor];
如果你使用 CGImage 解决方案,你可能会遇到图像大小的问题:
CGRect layer=self.navigationController.navigationBar.frame;
layer.size.height=57.0;
layer.origin.y=0;
self.navigationController.navigationBar.frame=layer;
CGImageRef imageRef = [UIImage imageNamed:@"myImg.png"].CGImage;
self.navigationController.navigationBar.layer.contents = (id)imageRef;
在我看来,图像被拉伸了,因为图层的高度似乎为 44.0 像素,但 UINavigationBar 的背景图像至少应为 57.0。
如果您尝试移动图层的框架,所有按钮都会在其中移动。