Iphone 自定义导航栏

Iphone 自定义导航栏,iphone,ios,user-interface,uinavigationcontroller,navigationcontroller,Iphone,Ios,User Interface,Uinavigationcontroller,Navigationcontroller,我在爬行运球时发现了附带的设计。我想知道如何做这样一个自定义导航栏。我的意思是如何创建一次导航栏,并对每个视图控制器隐式地重用它 我在考虑为其他视图控制器提供一种根视图控制器和继承,但我不知道如何做到这一点 任何想法或链接都将被告知 干杯 西里尔 您需要创建自己的UINavigationBar子类,并在需要导航控制器的地方使用 在这个自定义类中,您将绘制背景、按钮、文本等 更新 实际上,仔细看看这个例子,它似乎是一个UIToolBar。您可以为按钮指定导航方法,如popViewControll

我在爬行运球时发现了附带的设计。我想知道如何做这样一个自定义导航栏。我的意思是如何创建一次导航栏,并对每个视图控制器隐式地重用它

我在考虑为其他视图控制器提供一种根视图控制器和继承,但我不知道如何做到这一点

任何想法或链接都将被告知

干杯

西里尔


您需要创建自己的
UINavigationBar
子类,并在需要导航控制器的地方使用

在这个自定义类中,您将绘制背景、按钮、文本等


更新 实际上,仔细看看这个例子,它似乎是一个
UIToolBar
。您可以为按钮指定导航方法,如
popViewController:
等。对于“确认信息”和进度指示器,您可以使用标签和图像。对于右边的按钮,它只是一个图形


当然,您提供的示例只是一个概念,而不是实际的应用程序。但是,通过一些创造性、几个小时的编码和几个小时的图形设计,您可以实现相同的界面。

您可以使用库存UINavigationController并隐藏UINavigationBar


然后,创建自己的UIViewController子类,该子类包含所有导航元素,然后创建一个包含内容的灵活大小视图。使所有类都成为该元素的子类并绘制到视图中。按钮只需调用
[self.navigationController popViewControllerAnimated:YES]
,视图中的UILabel只需将其文本设置为
self.title

为导航栏设置自定义背景

UIImage *navBackground =[[UIImage imageNamed:@"navbarBackground"] 
                 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UINavigationBar appearance] setBackgroundImage:navBackground forBarMetrics:UIBarMetricsDefault];
然后在视图控制器中为左、右按钮和标题设置自定义视图

self.navigationItem.titleView = customTitleView;
self.navigationItem.leftBarButtonItem = customBarButton;
self.navigationItem.rightBarButtonItem = customBarButton2;

使用
类别
,在代理文件(.m)中添加下面的代码

编辑:


使用
Category
不是一个好方法,我在没有使用
Category
的情况下编写了一个演示,单击。

在较旧的iOS版本中,您必须对UINavigationBar进行子类化,即:

@interface CustomNavigationBar : UINavigationBar
@end

@implementation CustomNavigationBar

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.opaque = YES;
        self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"CustomBackground"]];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Skip standard bar drawing
}

@end
要在视图控制器中使用自定义导航栏,应在XIB中将标准类名更改为
CustomNavigationBar

此外,还可以通过编程方式设置自定义导航栏:

UIViewController *tempController = [[[UIViewController alloc] init] autorelease];
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:tempController] autorelease];

NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:navigationController];
NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:archive] autorelease];
[unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"];
UINavigationController *customNavigationController = [unarchiver decodeObjectForKey:@"root"];

UIViewController *contentController = [[[ContentViewController alloc] init] autorelease];
customNavigationController.viewControllers = [NSArray arrayWithObject:contentController];

现在,
customNavigationController
有了自定义导航栏。

多亏了iOS5,您现在可以自定义UINavigationBar的外观,而无需子类化或创建类别

以下代码块(将其放在ApplicationIDFinishLoading:method中)将把整个应用程序的UINavigationBar更改为您提供的任何图像

注意,这只适用于iOS5

[[UINavigationBar外观]setBackgroundImage:[UIImage ImageName:@“nav bar.png”]forBarMetrics:UIBarMetricsDefault]

但是,通过在viewDidLoad中使用以下代码,还可以根据所处的视图控制器更改单个UINavigationBar的外观

[self.navigationController.navigationBar setBackgroundImage:[UIImage ImageName:@“nav bar.png”]forBarMetrics:UIBarMetricsDefault]

以上代码仅讨论了使用iOS5定制UINavigationBar外观的新方法。但是,它没有讨论按钮的实现方式

然而,添加按钮是一个完全不同的游戏。为此,我建议子类化
UINavigationBar
,然后根据需要添加按钮。您甚至可能只需要一个标准的
UINavigationBar
,但定制的
UIBarButtonItem
s就可以运行特定的视图

例如:

UIView *rightButton = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 30.0f, 30.0f)] autorelease];
[rightButton addSubview:[UIImage imageNamed:@"rightButtonImage.png"]];

UIBarButtonItem *rightButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:rightButton] autorelease];
[rightButtonItem setAction:@selector(rightButtonAction:)];
我还没有测试过该代码,所以它不是一个复制/粘贴解决方案,但它让您知道需要做些什么来实现“定制”外观的UIBarButtonims


祝你好运

我也想看看是怎么做的!这正是我在当前项目中所需要的事实,这促使我编写一个自定义导航控制器。如果我启动并运行了一些东西,我会将其发布到github,并使用link.UINavigationController类引用进行更新:“这个类不是用于子类化的。”但是,你可能会发现我在以下问题中的帖子有帮助:UINavigationBar子类化,而不是controller。很有趣,我真的需要看看你的实现来了解它是如何工作的:)我在考虑一个基于此的解决方案,创建一个自定义根视图控制器来管理自定义导航栏和动画,但我不知道如何将其用于继承,有什么想法吗?苹果工程师建议永远不要使用类别来定制导航栏的外观。@SteveCotner看到我的编辑,我写了一个自定义导航栏的演示。在iOS5或更高版本中,使用category drawrect无法更改导航栏的外观,如果您像MFMailComposeViewController一样使用,其外观看起来很难看。谢谢。在iOS 5(和6…嘘…)中,我创建了一个类别并覆盖了sizeThatFits:以更改外观。哈奇,我知道,因为它有时在一个视图中被多次调用。但到目前为止,它一直有效,使我不必在每个视图控制器中自定义它。苹果不会因为这样做而拒绝一个应用,是吗?我还有一个问题@eric-lars0n。我将如何实际制作如图所示的导航按钮?我是否必须指定一个按钮正方形大小的UI框架,并将其添加为导航栏的子视图?
UIView *rightButton = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 30.0f, 30.0f)] autorelease];
[rightButton addSubview:[UIImage imageNamed:@"rightButtonImage.png"]];

UIBarButtonItem *rightButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:rightButton] autorelease];
[rightButtonItem setAction:@selector(rightButtonAction:)];