自定义导航栏

Cyr*_*ril 31 iphone user-interface uinavigationcontroller navigationcontroller ios

我正在抓住Dribble并找到了附件设计.我想知道如何做这样的自定义导航栏.我的意思是如何创建一次导航栏并为每个视图控制器隐式重用它.

我正在考虑使用一种根视图控制器并继承其他视图控制器,但我不知道如何做到这一点.

任何想法或链接将是appreachated!

干杯.

西里尔

导航栏图像

Seb*_*eek 8

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

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

请注意,这仅适用于iOS5

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];

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

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

由于iOS5,上面的代码仅讨论了自定义UINavigationBar外观的新方法.但是,它没有讨论按钮的实现方式.

但是,添加按钮完全是一个不同的游戏.为此,我建议继承子类UINavigationBar,然后通过它添加需要的按钮.你甚至可能只使用标准UINavigationBar但自定义的UIBarButtonItems逃避特定的视图.

例如:

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:)];
Run Code Online (Sandbox Code Playgroud)

我没有测试过该代码,因此它不是一个复制/粘贴解决方案,但它让您了解需要做些什么来完成"自定义"外观UIBarButtonItems.

祝好运!


Vad*_*dim 6

在较旧的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
Run Code Online (Sandbox Code Playgroud)

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

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

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];
Run Code Online (Sandbox Code Playgroud)

现在customNavigationController有了自定义导航栏.


Wri*_*sCS 1

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

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


更新

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

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

  • 事实上,这激励我编写一个自定义导航控制器。如果我启动并运行了一些东西,我会将其发布到 github 并使用链接进行更新。 (3认同)
  • UINavigationBar 子类化,而不是控制器。 (2认同)