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