2010-02-14 99 views
11

可能重复:
How to add background image on iphone Navigation bar?iPhone - 导航栏自定义背景

我正在寻找一种方式,有一个自定义导航栏,需要有一个自定义导航栏的背景来实现这一。我四处寻找如何做到这一点,但找不到解决方案。如果有人有解决方案,非常感谢帮助。

+0

有更多的解决方案替代解决方案在这里: http://stackoverflow.com/questions/1692487/how-to-add-background-image-on-iphone-navigation-bar –

回答

6

您可以将一个子视图(一个UIImageView)添加到navaigationBar,它只是一个UIView子类。

UINavigationBar nb = [[UINavigationBar alloc]init]; 
[nb addSubview: foo]; 
[nb release]; 

这里有一个论坛的帖子,描述了如何包装这一成一个类别:http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

10

(补充安德鲁约翰逊的反应)

链接的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到OD,作为一个类别(应该是覆盖),它有一些问题,其拥有。

所以,一个更通用和强大的解决方案是在这里:

http://samsoff.es/posts/customize-uikit-with-method-swizzling

+0

感谢链接对我来说亚当:)你是对的,重写类别的方法是一个非常糟糕的做法。 –

+0

有人低估了这个没有解释?不知道为什么。虽然我会补充一点:这整个问题(以及大部分答案)都只是iOS 2/3/4 - iOS 5有一个全新的系统。答案仍然适用于做iOS4的人。 – Adam

14

由于iOS5的,你可以轻松地设置自定义背景,用该方法了setBackgroundImage:forBarMetrics: 但你必须检查用户的手机拥有合适的操作系统。

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) 
{ 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"] 
                forBarMetrics:UIBarMetricsDefault]; 
} 

这是一个更好的解决方案,因为它在文档中。

+0

直到没有运行iOS5的用户运行您的应用程序 – JoeCortopassi

+3

是的,但有一个检查。你可以在else子句中做其他的事情。 – Martin

3

将其复制到viewDidLoad中。它将检查iOS 5并使用首选方法,否则会将子视图添加到NavBar for 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]; 
}