可能是重复问题:
如何在iPhone导航栏上添加背景图像?
我正在寻找一种方法来创建自定义的导航栏,并需要有一个自定义的导航栏背景来实现这一目标。我在寻找如何做到这一点,但没有找到解决方案。如果有人有解决方案,非常感谢您能提供帮助。
可能是重复问题:
如何在iPhone导航栏上添加背景图像?
我正在寻找一种方法来创建自定义的导航栏,并需要有一个自定义的导航栏背景来实现这一目标。我在寻找如何做到这一点,但没有找到解决方案。如果有人有解决方案,非常感谢您能提供帮助。
iOS5之后,你可以使用setBackgroundImage:forBarMetrics:方法轻松设置自定义背景。但是你必须检查用户的手机是否拥有正确的操作系统。
if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"]
forBarMetrics:UIBarMetricsDefault];
}
这是一个更好的解决方案,因为它在文档中。
(补充安德鲁·约翰逊的回答)
链接到的Apple.com文章包括3或4个不同的解决方案,其中大部分只“半”有效。我认为其中最优雅/有效的是这个:
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
然而...使用类别进行这种操作并不符合良好的 ObjC 实践(应该是重写方法),并且它本身也存在一些问题。
因此,一个更通用和强大的解决方案在这里:
http://samsoff.es/posts/customize-uikit-with-method-swizzling
您可以将一个子视图(UIImageView)添加到导航栏上,它只是UIView的子类。
UINavigationBar nb = [[UINavigationBar alloc]init];
[nb addSubview: foo];
[nb release];
以下是一个论坛帖子,描述了如何将此内容包装成一个类别:http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0
将此代码复制到viewDidLoad中。它将检查iOS 5并使用首选方法,否则将为iOS版本<5.0添加一个子视图到导航栏。这将在确保您的自定义背景图片没有透明度的情况下工作。
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
NSLog(@"%f",version);
UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"];
if (version >= 5.0) {
[self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
}
else
{
[self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1];
}