iPhone - 导航栏自定义背景

11

可能是重复问题:
如何在iPhone导航栏上添加背景图像?

我正在寻找一种方法来创建自定义的导航栏,并需要有一个自定义的导航栏背景来实现这一目标。我在寻找如何做到这一点,但没有找到解决方案。如果有人有解决方案,非常感谢您能提供帮助。


这里有更多的替代方案:https://dev59.com/GHI-5IYBdhLWcg3wwLW3 - Leslie Godwin
4个回答

14

iOS5之后,你可以使用setBackgroundImage:forBarMetrics:方法轻松设置自定义背景。但是你必须检查用户的手机是否拥有正确的操作系统。

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

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


直到没有运行 iOS5 的用户运行您的应用程序。 - JoeCortopassi
3
可以,但是可以在 else 子句中编写其他内容,这一点已经进行了检查。 - Martin

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 实践(应该是重写方法),并且它本身也存在一些问题。

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

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


谢谢你链接到我,Adam :) 你说得对,使用分类覆盖方法是非常糟糕的做法。 - Sam Soffes
有人没有解释就给这个点了踩?不确定为什么。虽然我想补充一下:整个问题(以及大多数答案)都只适用于iOS 2/3/4 - iOS 5有一个全新的系统来完成这个任务。这个答案对于正在使用iOS4的人仍然有效。 - Adam

6

您可以将一个子视图(UIImageView)添加到导航栏上,它只是UIView的子类。

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

以下是一个论坛帖子,描述了如何将此内容包装成一个类别:http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0


3

将此代码复制到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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接