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

我已经在我的博客上完成了教程,所以我知道如何制作可展示底部(堆栈)视图控制器标题的可拉伸button。 但我希望做的是有图标(如家的房子),没有文字,不resize。

使用我的自定义图像和下面的代码,我得到了一个拉伸的版本(不需要),标题顶部(不想),它点击时是色调/高亮(是好的);

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

屏幕截图1

现在,我已经在这里search,并阅读所有类似的问题,回到旧的答案,对我来说有奇怪的结果。 这是我尝试的代码;

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

这种方法不伸展我的自定义图像button(是好的),也没有显示文字(我想要的),但仍然是原来的蓝色button(跆拳道),和我的自定义button不点击时点击,只有它下面的蓝色button!

屏幕截图2

请帮忙,我错过了什么?

*更新

我已经通过使用可resize的图像来修复它了。 这迫使它不能'伸展'

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

要解决显示在button上的标题,我必须做的

 self.title =@" "; 

现在这是一个肮脏的修复,但它似乎工作。 现在剩下的唯一问题是我想在不同的视图上使用不同的后退button,而这种方法会造成一些麻烦。 设置button的最后一个视图覆盖所有其他视图。 所以最后,根据你如何浏览应用程序,回到以前的视图有错误的后退button,它不会重置到正确的。

更新2:潜在的想法:

以下是一个合理的解决scheme,或者是一个破解可能会破坏的东西吗?

像隐藏默认的后退button,

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

…然后使用一个自定义的UIBarButtonItem,其中一个button的样式实际上是放置在后退button的位置,当点击时发送一个popViewControllerAnimated:消息到UINavigationController。

如果你知道更强大的解决scheme,请分享,谢谢。

假设你现在的解决scheme

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

是你可以接受的,所以唯一的问题是如何在你的视图之间来回更新这个buttonappeareance,一个可以工作的方法是在你的每个控制器的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当前方法UIBarButtonItem ,则需要使用initWithCustomView:来初始化您的barbutton项目。 在这种情况下,你可以指定,例如,一个UIImageView你喜欢的图像,它应该工作:

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

希望这可以帮助。

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

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

 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。

如果你正在使用故事板,它太容易了。 采取一个圆形的矩形button,并将其放置在导航栏上。 然后双击button(在select时,首先,它只显示栏button的属性,但通过select两次,你可以改变它的所有属性,就像你自定义一个常规的UIbutton)。

UIAppearance在这种情况下是没有用的。

我试着用: - [UIBarButtonItem initWithCustomView:] 。 这里的视图可以添加你的背景图片和标题,无论你想要什么。