我在 Dribble 上浏览时发现了附带的设计,想知道如何创建类似这样的自定义导航栏。我的意思是,如何创建一次导航栏并将其隐式地重用于每个视图控制器。
我考虑过创建一种根视图控制器并从其他视图控制器继承它,但我不知道该如何实现。
如果您有任何想法或链接,请告诉我!
谢谢。
Cyril
我在 Dribble 上浏览时发现了附带的设计,想知道如何创建类似这样的自定义导航栏。我的意思是,如何创建一次导航栏并将其隐式地重用于每个视图控制器。
我考虑过创建一种根视图控制器并从其他视图控制器继承它,但我不知道该如何实现。
如果您有任何想法或链接,请告诉我!
谢谢。
Cyril
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:)];
我没有测试过该代码,因此它不是一种复制/粘贴的解决方案,但它给了您一个实现“自定义”外观UIBarButtonItems所需做的事情的想法。
祝你好运!
在旧版 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
拥有了自定义的导航栏。为NavigationBar设置自定义背景
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;
UINavigationBar
子类,并在需要navigationController的地方使用它。实际上,仔细观察这个例子,它似乎是一个UIToolBar
。你可以将导航方法分配给按钮,如popViewController:
等。对于"确认信息"和进度指示器,你可以使用标签和图片。对于右侧按钮,只需使用一个图形即可。
当然,你提供的示例只是一个概念,而不是一个实际的应用程序。但是通过一些创意、几小时的编程和几个小时的图形设计,你可以实现相同的界面。
您可以使用默认的UINavigationController并隐藏UINavigationBar。
然后,创建一个UIViewController的子类,其中包含所有导航元素和一个自适应大小的视图,用于放置内容。使所有的类都继承这个元素并绘制到视图中。按钮只需调用[self.navigationController popViewControllerAnimated:YES]
,视图中的UILabel只需将其文本设置为self.title
即可。
使用Category
,在您的委托文件(.m)中添加以下代码
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect
{
UIImage *navBg = [UIImage imageNamed:@"NavBar.png"];
[navBg drawInRect:CGRectMake(0, 0, 320, 44)];
}
@end
编辑:
使用 Category
不是一个好的方式,我写了一个示例,不使用 Category
,点击 这里。