iOS导航栏设置自定义返回按钮的方法

3
我需要一些关于如何自定义“backBarButtonItem”的帮助。不要使用LeftBarButtomItem,因为我想继承样式并保持从“BackBarButtom”的转换。
好的,那么我现在所了解的是:
UIBarButtonItem* barbtnItem = [[UIBarButtonItem alloc]initWithCustomView:  [ArrivalProto ArrivalBtnTypeBack]];

"

[ArrivalProto ArrivalBtnTypeBack]会返回一个自定义的UIbutton,其中包含setBackgroundImage和setImage。

然后我想要做的就是将其添加到自定义的BackBarButton中:

"
[self.navigationItem setBackBarButtonItem: barbtnItem];

但是没有啊。只有普通的返回按钮 :((( 虽然这样看起来是有效的:
//self.navigationItem setLeftBarButtonItem:barbtnItem];

And this as well:

UIImage *btnTrnspBgrImg30 = [[UIImage imageNamed:@"trspBlackBtn30"]resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)]; 
 [[UIBarButtonItem appearance] setBackButtonBackgroundImage:btnTrnspBgrImg30      forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

信息:
[self.navigationItem setBackBarButtonItem: <#(UIBarButtonItem *)#>];
[self.navigationItem setLeftBarButtonItem:<#(UIBarButtonItem *)#>]
1个回答

3
自从iOS5以来,我们有了一种出色的新方式,可以使用外观代理(即[UIBarButtonItem appearance])来自定义几乎任何控件的外观。外观代理允许您对控件的外观进行应用程序范围的更改。下面是一个使用外观代理创建的自定义返回按钮的示例。

enter image description here

使用下面的示例代码创建一个带有自定义图像的后退按钮,用于正常和高亮状态。从您的appDelegate的application:didFinishLaunchingWithOptions:方法中调用以下方法。
- (void) customizeAppearance {

UIImage *i1 = [[UIImage imageNamed:@"custom_backButton_30px"]
                      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 6)];
UIImage *i2 = [[UIImage imageNamed:@"custom_backButton_24px"] 
                      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 6)];

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:i1 
                              forState:UIControlStateNormal 
                              barMetrics:UIBarMetricsDefault];

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:i2 
                              forState:UIControlStateNormal 
                              barMetrics:UIBarMetricsLandscapePhone];

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:i1
                              forState:UIControlStateHighlighted 
                              barMetrics:UIBarMetricsDefault];

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:i2 
                              forState:UIControlStateHighlighted 
                              barMetrics:UIBarMetricsLandscapePhone];
}

这只是一个快速的例子。通常情况下,您会希望为正常状态和高亮(按下)状态拥有单独的图像。
如果您有兴趣自定义其他控件的外观,可以在这里找到一些很好的示例:http://ios.biomsoft.com/2011/10/13/user-interface-customization-in-ios-5/

感谢您的快速回复。我认为在我的帖子中已经提到了,我尝试并成功使用了您的方法。但是我失去了添加background.png并在其上附加icon.png的可能性:(这很奇怪,因为leftBarButton可以正常工作,而backBarButton似乎具有相同的属性。[self.navigationItem setLeftBarButtonItem:<#(UIBarButtonItem *)#>]也许我已经走到了死胡同? - Pedroinpeace
不太确定您的意思。您正在尝试替换leftBarButtonItem,而这种方法使用外观代理以及UIBarMetricsLandscapePhone栏度量标准。更多信息请参见此处:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html - memmons
在重新阅读了您的问题后,我认为我明白您想要做什么了。您想要用自定义按钮替换返回按钮,同时保留返回按钮具有的特殊转换效果。这是不可能的。您可以更改外观并保留转换效果,或者更改类并失去转换效果。 - memmons
无论如何,为什么需要一个自定义类来允许您设置背景和前景图像?只需将两个图像组合在一起并使用外观代理进行设置即可。 - memmons
从一开始,我实际上发了另一个关于遮罩您正确提到的相同按钮的问题。我只想遮盖icon.png。这样我就可以在iOS设置不同颜色方案的情况下重复使用相同的图标。 所以现在我知道了backBarButton能做什么和不能做什么,并且阅读了您的答案后帮助了我很多,也让我更了解了这个问题。 也许你也知道如何回答遮罩的问题? 如果我将我的按钮实现为leftBarButton实例的方式,我已经了解了tintColoring,但似乎无法在导航栏中进行遮罩。 - Pedroinpeace

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