iOS 5:如何实现自定义(图像)后退按钮

时间:2012-05-25 15:50:38

标签: iphone objective-c ios ios5 uibarbuttonitem

我已经在我的博客上完成了教程,所以我知道如何制作一个可以显示底部(堆栈)viewcontroller标题的可伸缩按钮。但我希望做的是有图标(比如HOME的房子),没有文字,也没有调整大小。

使用我的自定义图片和下面的代码,我得到一个拉伸版本(不想要),标题超过顶部(不想要),点击时显示/突出显示(很好);

UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

screen shot 1

现在,我在这里搜索并阅读所有返回旧答案的类似问题,并为我得到了奇怪的结果。这是我试过的代码;

  UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStyleBordered target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;

此方法不会拉伸我的自定义图像按钮(很好),也不显示文本(我想要的)但是它下面仍然有原始的蓝色按钮(WTF),而我的自定义按钮没有单击时的色调,只有它下面的蓝色按钮!

screen shot 2

请帮忙,我错过了什么?

* UPDATE

我通过使用可调整大小的图像来修复它。这迫使它不要'伸展'

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

要修复我必须执行的按钮上显示的标题

self.title =@" ";

现在这是一个肮脏的修复,但它似乎工作。现在唯一的问题是我想在不同的视图上使用不同的后退按钮,这种方法会造成一些麻烦;设置按钮的最后一个视图会覆盖所有其他视图。因此,最终,根据您在应用程序中的导航方式,返回上一个视图时会出现错误的后退按钮,并且它永远不会重置为正确的按钮。


更新2:潜在的想法:

以下是一个合理的解决方案,还是一个容易破坏的黑客?

隐藏默认后退按钮,就像这样,

[self.navigationItem setHidesBackButton:YES animated:NO];

...然后使用自定义UIBarButtonItem,我想要放置在后退按钮位置的样式中的按钮,在点击时向UINavigationController发送popViewControllerAnimated:消息。

如果您知道更强大的解决方案,请分享,谢谢。

5 个答案:

答案 0 :(得分:13)

假设您当前的解决方案

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

是您可以接受的,因此唯一的问题是当您在视图之间来回切换时如何更新该按钮的外观,一种可行的方法是在每个控制器中执行上面的代码{{1}方法:

viewWillAppear:

如果您对目前使用自定义- (void)viewWillAppear:(BOOL)animated { UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; } 的方法不满意,那么可以使用UIBarButtonItem初始化条形按钮项。在这种情况下,您可以使用您喜欢的图片指定initWithCustomView:,它应该有效:

UIImageView

希望这有帮助。

答案 1 :(得分:9)

对于iOS 5+,请使用[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"someimage.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]

答案 2 :(得分:3)

我在项目中使用的一些代码:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *btnImg = [UIImage imageNamed:@"ButtonRetourInactive"];
[btn setImage:btnImg forState:UIControlStateNormal];

btn.frame = CGRectMake(0, 0, btnImg.size.width, btnImg.size.height);
[btn addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease];

请注意,这适用于iOS 4和3。

答案 3 :(得分:0)

如果您使用的是故事板,那就太容易了。取一个圆形矩形按钮并将其放在导航栏上。然后双击按钮(在选择时,首先,它只显示条形按钮的属性,但通过选择两次,您可以更改其所有属性,就像您要自定义常规UI按钮一样)。

答案 4 :(得分:0)

在这种情况下,

UIAppearance没用。

我试过用: - [UIBarButtonItem initWithCustomView:]。 在这里您可以添加背景图像和标题,无论您想要什么。