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

Iphone iOS 5:如何实现自定义(图像)后退按钮,iphone,objective-c,ios,ios5,uibarbuttonitem,Iphone,Objective C,Ios,Ios5,Uibarbuttonitem,我已经在我的博客上完成了这个教程,所以我知道如何制作一个可伸缩的按钮来显示底部(堆栈)viewcontroller的标题。但我希望做的是有图标(像一个家的房子),没有文字,也没有调整大小 使用我的自定义图像和下面的代码,我得到了一个拉伸版本(不需要),上面有标题(不需要),单击时它会着色/高亮显示(很好) 现在,我已经在这里搜索并阅读了所有类似的问题,这些问题返回了旧的答案,对我来说有奇怪的结果。这是我试过的代码 UIImage *backButtonImage = [UIImage im

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

使用我的自定义图像和下面的代码,我得到了一个拉伸版本(不需要),上面有标题(不需要),单击时它会着色/高亮显示(很好)

现在,我已经在这里搜索并阅读了所有类似的问题,这些问题返回了旧的答案,对我来说有奇怪的结果。这是我试过的代码

  UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStyleBordered target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
此方法不会拉伸我的自定义图像按钮(很好),也不会显示文本(我想要的),但是它下面仍然有原始的蓝色按钮(WTF),并且我的自定义按钮在单击时不会着色,只有它下面的蓝色按钮会着色

请帮忙,我错过了什么

*更新

我已经用一个可调整大小的图像把它修好了一点。这迫使它不能“拉伸”

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];
…然后使用自定义UIBarButtonim,在后退按钮的位置放置一个我真正想要的样式的按钮,点击该按钮时会向UINavigationController发送消息


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

对于iOS 5+使用
[[uibarbuttonite外观]setBackButtonBackgroundImage:[UIImage imageNamed:@“someimage.png”]forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]
假设您当前的解决方案

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
是您可以接受的,所以剩下的唯一问题是如何在视图之间来回切换时更新按钮外观,一种可行的方法是在每个控制器的
视图中执行上述代码:
方法:

- (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
,它应该可以工作:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:[UIImageView ...]];

希望这能有所帮助。

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

ui外观
在这种情况下没有用处

我尝试使用:
-[UIBarButtonItem initWithCustomView::

在这里的视图中,您可以添加背景图像和标题,无论您想要什么。

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

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和iOS 3。

您不能从属性检查器更改它吗?我希望我知道如何。。。我选择了故事板中的第一个视图控制器,然后转到属性检查器,我确实看到导航项下有一个框,上面写着“后退”按钮,但是我不知道如何使用它;我试着输入图像名称,但似乎没有任何作用。有什么建议吗?还有另一种方法可以解决这个问题-你可以将一个通用按钮拖到导航栏上,然后玩自定义图像和名称。。我希望这对你有帮助@复仇女神有没有办法让那个按钮表现出后退按钮的行为?正如最初发布的,这是我已经尝试过的,我得到了一个标题在顶部的拉伸版本(不需要)。你的图像需要与苹果的图像一样高/宽。您可能还希望使用
[[UIImage imageNamed:@“someimage.png”]resizebleimagewithcapinsets:UIEdgeInsetsMake(6,6,6,6)]
创建一个可调整大小的图像。实际的图像需要与苹果的高度相同,但是宽度应该足够大,以适应中间的左和右的上限+1px,这将以编程方式扩展到适合文本。谢谢安得烈的建议,但是,您没有解决在每个视图上有不同的自定义后退按钮的主要问题,这些按钮具有不同的图像和文本。@AndrewTheis苹果的高度是多少?@Piotr:Apple的高度是30点(因此30像素的非视网膜,60像素的视网膜)。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@RobDigital:为此,您必须手动将
UIViewController
上的
self.navigationItem.LeftBarButtonim
设置为您自己的
UIBarButtonim
。您可以使用
initWithCustomView
创建一个,以完全自定义UI,或者使用
appearancewhen containedin
自定义特定视图上的后退按钮图像。如果要删除标题,需要使用
initWithCustomView
方法。然而,苹果公司建议,只要可能,你的后退按钮就应该是上下文相关的。
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];