最惯用的iOS5方式定制UINavigationBar?

时间:2012-09-20 03:03:14

标签: iphone ios cocoa-touch ios5

我正在努力在我的应用中自定义导航控制器的外观,如下所示:

enter image description here

正如我在经过几个小时的SO研究后发现的那样,有很多不同的方法可以做到这一点,有些是真正的hackish,有些则更少。我很想知道实现这一目标的Apple祝福/最优雅的方式,随着应用程序的增长,这将导致最少的痛苦。到目前为止我已经研究过一些方法:

1)我通过[UINavigationBar外观]应用图像来改变导航栏的背景/高度,似乎工作正常。

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"];

[[UINavigationBar appearance] setBackgroundImage:navBarImage
                                   forBarMetrics:UIBarMetricsDefault];

似乎是实现背景/身高变化的最“现代”方式,尽管它很可能无法在方向变化中存活下来。可以在这里做出任何改进吗?

2)我在推送视图的viewDidLoad中使用以下内容替换了默认后退按钮

// Set the custom back button
UIImage *buttonImage = [UIImage imageNamed:@"back.png"];

//create the button and assign the image
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:buttonImage forState:UIControlStateNormal];

//set the frame of the button to the size of the image (see note below)
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);

[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

// offset the back button
button.contentEdgeInsets = UIEdgeInsetsMake(10, 5, -10, -5);

//create a UIBarButtonItem with the button as a custom view
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = customBarItem;

我对这个解决方案不是很满意,因为它会将栏的自定义留给导航堆栈顶部的控制器。 From the Apple docs看起来他们更喜欢你完全继承UINavigationBar并在导航控制器中一劳永逸地替换它:

  

您还可以使用initWithNavigationBarClass:toolbarClass:方法指定自定义UINavigationBar子类来初始化导航控制器。

这是建议的路线吗?我无法通过[UIBarButtonItem外观]替换UINavigationBar的默认后退按钮,因为它仍然尝试在按钮中显示文本,当您删除文本时,按钮根本不显示。建议?

3)页面标题应该可以通过navigationItem.titleView替换为另一个视图。还有什么更好的吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

1)您应该为两个UIBarMetrics(UIBarMetricsDefault和UIBarMetricsLandscapePhone的单独图像)设置两个图像。因此

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"];
UIImage *navBarImage_Landscape = [UIImage imageNamed:@"navigation-bar-landscape.png"];

[[UINavigationBar appearance] setBackgroundImage:navBarImage
                                   forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:navBarImage_Landscape
                               forBarMetrics:UIBarMetricsLandscapePhone];

2)您可以将UINavigationBar子类化(正如您所提到的那样,这将是默认的Apple方式)。或者,如果它只是按钮,也许您可​​以通过传入“”(空文本)

来破解其行为

3)不确定你的意思。你可以设置导航栏的标题,它会显示你想要的任何标题。或者你应该能够为titleView

插入另一个视图

请注意,setBackgroundImage是iOS 5.0及更高版本。