iOS 7中自定义UINavigation返回按钮的图像

35

我有一个自定义的 UIBarButtonItem 带有一张图片,它在 iOS 6.1 上运行良好。但是 iOS 7 有一个 tintColor ,它会覆盖我的图片。如果我将 tintColor 设置为 [UIColor clearColor] ,则整个按钮都不会显示。

如何使我的返回按钮在 iOS 7 中像在 iOS 6 中一样显示?请帮忙解决问题。

iOS 6.1

iOS 7


2
你不应该使用一个 bar button item 作为返回按钮。相反,应该为导航栏设置 backIndicatorImage - Felix
该应用在所有iOS版本中必须具有相同的外观。backIndicatorImage仅适用于iOS 7。我已经在iOS 6中使用了 mask。`const float colorMask[6] = {222, 255, 222, 255, 222, 255}; UIImage *image = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors([[UIImage alloc] init].CGImage, colorMask)];[backButtonItem setBackgroundImage:image forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];` - Majid
我正在使用iOS5,你能帮我吗? - chandru
6个回答

43

您应该使用UINavigationBar上的外观来全局设置自定义返回按钮。

[UINavigationBar appearance].backIndicatorImage = customBackButton;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = customBackButton;

8
我想补充一点,customBackButton 图片应该使用 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal,像这样 [[UIImage imageNamed:@"imageName"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 这样它才能显示图片的颜色。 - Scar
1
不适用于iOS 9: 没有backIndicatorImage。 - Eugene Braginets
@Sebastian 你说得对,已经修复并忘记了那个问题。可能是打错了字,自动补全没有起作用。感谢你指出这个问题! - Eugene Braginets
如何在外观中删除所有返回按钮的标题? - Nike Kov
2
Xcode/Swift似乎不知道这些内容,因为它们在自动完成中没有显示,但是编译和运行是可以的。 - Brandon Haugen

23

在iOS7中,尝试像这样设置UIBarButtonItem

UIImage *temp = [[UIImage imageNamed:@"theImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal];    
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithImage:temp style:UIBarButtonItemStyleBordered target:self action:@selector(action)];

这是苹果开发者中心的原始帖子讨论区

如果要同时支持iOS7及以下版本,则需检查 system-version 并设置代码,例如:

UIImage *temp=nil;

if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
{ 
    temp = [UIImage imageNamed:@"btn-back.png"]; 
}
else
{ 
    temp = [[UIImage imageNamed:@"btn-back.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal];
 }

谢谢,这个可行。然而,在iOS 6中UIImageRenderingModeAlwaysOriginal不起作用,我必须检查iOS版本。`UIImage *backImage = nil;if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0){ backImage = [UIImage imageNamed:@"btn-back.png"]; }else{ backImage = [[UIImage imageNamed:@"btn-back.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]; }` - Majid
谢谢,我刚刚编辑了我的答案以支持两个版本,帮助那些遇到相同问题的人。 - Nitin Gohel
还有一件小事,你应该在图片中去掉“.png”。这样iOS就可以选择高清和非高清图片,或者设备特定的图片。 - Michael
我认为在这种情况下,respondsToSelector: 更加合适。UIImage *temp = [UIImage imageNamed:@"btn-back.png"]; if ([temp respondsToSelector:@selector(imageWithRenderingMode:)]) { temp = [temp imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } - christopherdrum
UIBarButtonItemStyleBordered在iOS8.x中已被弃用。请使用UIBarButtonItemStylePlain。 - John Stack

20
以下内容对于那些不想去操作现有的目标动作等的人似乎更有意义。只需复制并粘贴即可。此外,这会强制iOS使用您的图像及其所有特点,而不仅仅是使用图像的模板/印象。
- (void)setCustomNavigationBackButton
{
    UIImage *backBtn = [UIImage imageNamed:@"arrow"];
    backBtn = [backBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.navigationItem.backBarButtonItem.title=@"";
    self.navigationController.navigationBar.backIndicatorImage = backBtn;
    self.navigationController.navigationBar.backIndicatorTransitionMaskImage = backBtn;
}

arrow是您的图片名称。


8

Swift版本:

var backBtn = UIImage(named: "return_menu")
backBtn = backBtn?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)

self.navigationController!.navigationBar.backIndicatorImage = backBtn;
self.navigationController!.navigationBar.backIndicatorTransitionMaskImage = backBtn;

2
直到我添加了“imageWithRenderingMode”才开始工作...谢谢! - Henrique da Costa

6

可以试试这种方法:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationController.navigationBar.backIndicatorImage = [UIImage imageNamed:@"yourImageName.png"];
self.navigationController.navigationBar.backIndicatorTransitionMaskImage = [UIImage imageNamed:@"yourImageName.png"];

这将在全局色调中创建一张图像掩模,从而为您提供自定义的图标。不适用于彩色图像。


0
// 添加图片到按钮
UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom];
[refreshButton setFrame:CGRectMake(0,0,30,30)];
refreshButton.userInteractionEnabled = YES;
[refreshButton setImage:[UIImage imageNamed:@"yourimage.jpg"] forState:UIControlStateNormal];

// ASSIGNING THE BUTTON WITH IMAGE TO BACK BAR BUTTON

UIBarButtonItem *refreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:refreshButton] autorelease];
self.navigationItem.leftBarButtonItem = refreshBarButton;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接