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

Rob*_*tal 12 iphone objective-c uibarbuttonitem ios ios5

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

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

UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

屏幕截图1

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

  UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStyleBordered target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
Run Code Online (Sandbox Code Playgroud)

这个方法不会拉伸我的自定义图像按钮(很好),也不会显示文本(我想要的)但是它下面仍然有原始的蓝色按钮(WTF),并且我的自定义按钮在点击时不会着色,只有它下面的蓝色按钮呢!

屏幕截图2

请帮忙,我错过了什么?

*更新

我使用可调整大小的图像修改了一下.这迫使它不要'伸展'

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

要修复出现在我必须做的按钮上的标题

self.title =@" ";
Run Code Online (Sandbox Code Playgroud)

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


更新2:潜在想法:

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

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

[self.navigationItem setHidesBackButton:YES animated:NO];
Run Code Online (Sandbox Code Playgroud)

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

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

ser*_*gio 13

假设您当前的解决方案

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

您可以接受,因此唯一的问题是当您在视图之间来回切换时如何更新该按钮的外观,可行的方法是在每个控制器的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];
}
Run Code Online (Sandbox Code Playgroud)

如果您对当前的自定义方法不满意UIBarButtonItem,那么可以使用初始化条形按钮项目initWithCustomView:.在这种情况下,您可以指定,例如,UIImageView使用您喜欢的图像,它应该工作:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:[UIImageView ...]];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


And*_*eis 9

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

  • 感谢Andrew的建议,但是你没有解决在每个视图上使用不同图像和NO TEXT设置不同自定义后退按钮的主要问题. (2认同)