Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-导航栏自定义背景_Iphone_Sdk_Uinavigationcontroller_Navigation - Fatal编程技术网

iPhone-导航栏自定义背景

iPhone-导航栏自定义背景,iphone,sdk,uinavigationcontroller,navigation,Iphone,Sdk,Uinavigationcontroller,Navigation,可能重复: 我正在寻找一种方法,有一个自定义的导航栏,需要有一个自定义的导航栏背景来实现这一点。我四处寻找如何做到这一点,但找不到解决办法。如果有人有这个解决方案,我们将非常感谢您的帮助。您只需向导航栏添加一个子视图(UIImageView),它只是一个UIView子类 UINavigationBar nb = [[UINavigationBar alloc]init]; [nb addSubview: foo]; [nb release]; 这里有一篇论坛帖子,描述了如何将其归入一个类别:

可能重复:


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

您只需向导航栏添加一个子视图(UIImageView),它只是一个UIView子类

UINavigationBar nb = [[UINavigationBar alloc]init];
[nb addSubview: foo];
[nb release];
这里有一篇论坛帖子,描述了如何将其归入一个类别:

(补充安德鲁·约翰逊的回答)

链接的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作为一个类别(应该是一个覆盖)不是一个好的实践,它本身也有一些问题

因此,这里有一个更通用、更强大的解决方案:


自iOS5以来,您可以使用setBackgroundImage:forBarMetrics: 但是你必须检查用户的手机是否有正确的操作系统

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

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

将其复制到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];
}

谢谢你链接到我亚当:)你是对的,用类别覆盖方法是一种非常糟糕的做法。有人在没有解释的情况下否决了这一点?不知道为什么。尽管我想补充一句:整个问题(以及大部分答案)都是iOS 2/3/4版本的,iOS 5有一个全新的系统来解决这个问题。答案仍然适用于正在使用iOS4的用户。这里有更多的解决方案可供选择:直到没有运行iOS5的用户运行您的应用程序。是的,但有一个检查。你可以在else子句中做些别的。