iphone - iOS 5 : How to implement a custom (image) back button

标签 iphone objective-c ios ios5 uibarbuttonitem

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

使用我的自定义图像和下面的这段代码,我得到了一个拉伸(stretch)版本(不需要),标题位于顶部(不需要),并且在单击时它会着色/突出显示(很好);

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;

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

screen shot 2

请帮忙,我错过了什么?

*更新

我已经通过使用可调整大小的图像对其进行了一些修复。这迫使它不“拉伸(stretch)”

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

要修复按钮上显示的标题,我必须这样做

self.title =@" ";

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


更新 2:潜在想法:

以下是一个合理的解决方案,还是一个容易破坏某些东西的 hack?

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

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

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

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

最佳答案

假设您当前的解决方案

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

对你来说是可以接受的,所以剩下的唯一问题是当你在 View 之间来回切换时如何更新按钮外观,一种可行的方法是在每个 Controller 的 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,它应该可以工作:

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

希望这对您有所帮助。

关于iphone - iOS 5 : How to implement a custom (image) back button,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10757565/

相关文章:

iphone - 清除部分 UIImage

iphone - 将省略号添加到 NSString

c++ - 将 NSInteger 传递给 size_t 并将 NSInteger* 传递给 size_t*

iphone - 保存数据后如何呈现详细 View

iOS内存管理属性

ios - 如何在 UITextField 中写入文本并在 uiWebview 中写入 textField 时发送文本?

iphone - 如何隐藏/删除联系人选择器上的搜索栏

objective-c - 如何定义仅在 objective-c 框架内可见的方法和属性?

ios - 在 iOS 中使用正则表达式解析 NSString

ios - 如何在 iPhone 笔记应用程序中添加和删除笔记