12

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

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

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

屏幕截图 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),并且我的自定义按钮在单击时不会着色,只有它下面的蓝色按钮可以!

屏幕截图 2

请帮忙,我错过了什么?

*更新

我通过使用可调整大小的图像对其进行了一些修复。这迫使它不要“伸展”

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:消息。

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

4

5 回答 5

13

假设您当前的解决方案

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

您可以接受,所以剩下的唯一问题是当您在视图之间来回切换时如何更新该按钮的外观,一种可行的方法是在每个控制器的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 ...]];

希望这可以帮助。

于 2012-09-12T18:29:01.757 回答
9

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

于 2012-05-31T01:12:14.223 回答
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。

于 2012-09-13T10:29:23.563 回答
0

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

于 2012-09-13T09:31:21.707 回答
0

UIAppearance在这种情况下没有用。

我尝试使用: - [UIBarButtonItem initWithCustomView:]。您可以在此处的视图中添加背景图像和标题,随心所欲。

于 2012-09-13T09:42:06.450 回答