自定义 UINavigationBar 的最惯用的 iOS5 方式?

Posted

技术标签:

【中文标题】自定义 UINavigationBar 的最惯用的 iOS5 方式?【英文标题】:Most idiomatic iOS5 way of customizing the UINavigationBar? 【发布时间】:2012-09-20 03:03:13 【问题描述】:

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

经过几个小时的 SO 研究后,我发现,有很多不同的方法可以做到这一点,有些非常老套,有些则少得多。我有兴趣找出 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】:

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 及更高版本。

【讨论】:

以上是关于自定义 UINavigationBar 的最惯用的 iOS5 方式?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 问题的自定义背景

如何自定义 UINavigationBar

UINavigationBar 自定义标题视图

IOS5中如何自定义UINavigationBar

如何在 UINavigationBar 上设置自定义按钮?

UINavigationBar 自定义标题被背景隐藏