iPhone - NavigationBar 自定义背景 [重复]

Posted

技术标签:

【中文标题】iPhone - NavigationBar 自定义背景 [重复]【英文标题】:iPhone - NavigationBar Custom Background [duplicate] 【发布时间】:2011-01-16 15:00:46 【问题描述】:

可能重复:How to add background image on iphone Navigation bar?

我正在寻找一种具有自定义导航栏的方法,并且需要具有自定义导航栏背景才能实现此目的。我一直在寻找如何做到这一点,但找不到解决方案。如果有人有解决方案,非常感谢您的帮助。

【问题讨论】:

这里有更多替代解决方案:***.com/questions/1692487/… 【参考方案1】:

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

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])

    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"]
                                                  forBarMetrics:UIBarMetricsDefault];

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

【讨论】:

直到没有运行 iOS5 的用户运行您的应用程序 是的,但是有一个检查。你可以在 else 子句中做点别的。【参考方案2】:

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

链接的 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 链接到我 :) 你说得对,用类别覆盖方法是一种非常糟糕的做法。 有人在没有解释的情况下否决了这个?不知道为什么。虽然我要补充:整个问题(以及大多数答案)仅适用于 iOS 2/3/4 - iOS 5 有一个全新的系统来执行此操作。答案仍然适用于正在做 iOS4 的人。【参考方案3】:

你可以在navaigationBar中添加一个子视图(一个UIImageView),它只是一个UIView的子类。

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

这是一个论坛帖子,描述了如何将其包装到一个类别中:http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

【讨论】:

【参考方案4】:

将其复制到 viewDidLoad 中。它将检查 iOS 5 并使用首选方法,否则它将为 iOS 版本

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];

【讨论】:

以上是关于iPhone - NavigationBar 自定义背景 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

自定义 NavigationBar 中的 UISearchBar

在 iPhone X 上,分别控制显示/隐藏导航栏和状态栏

Ipad NavigationBar 横向问题

iPhone X 适配

自定义 UITableView - iphone

禁用重新排列标签 iphone