UINavigationController中的自定义后退按钮
对于我正在开发的应用程序,我需要在导航栏中显示自定义后退按钮。我有按钮的资产为PNG图像,而且我在写这段代码:当我把这个视图控制器UINavigationController中的自定义后退按钮
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, 79, 29.0);
[backButton setImage:[UIImage imageNamed:@"button_back.png"] forState:UIControlStateNormal];
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
}
,自定义按钮没有显示出来,而是我得到的标准的后退按钮,里面有这个视图控制器的标题。
事情我已经尝试过:
- 再次检查,确认按钮
backButton
正确创建的,通过将其添加到视图层级结构。它正确显示。 - 以相同的方法,更改
navigationItem
的title
属性,并确认它改变(如预期)我的后退按钮的内容。
任何人都可以发现我做错了什么吗?有没有人成功地将自定义图像用作UINavigationController
的后退按钮?
backBarButtonItem
属性按预期工作,但它总是会根据导航栏色调颜色添加其标准按钮形状和颜色。
您可以自定义文字,但不能替换图像。
Andrew Pouliot建议的一种解决方法是使用leftBarButtonItem
代替,但我坚持使用标准按钮。
令人困惑backBarButtonItem
不是你要找的。
它只是控制下一个视图控制器的后退按钮上的标题。你想要的是将leftBarButtonItem
设置为您的自定义后退按钮。
只需创建一个UIBarButtonItem
而不是嵌入UIButton
的UIBarButtonItem
。工作正常!
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"button_back.png"] style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
这不起作用。仍然显示后退按钮背景图像(除非您使用的图像大于默认后退按钮图像) – probablyCorey 2011-05-12 01:15:49
http:// stackoverflow。com/questions/526520/how-to-create-backbarbuttomitem-with-custom-view-for-a-uinavigationcontroller/7184426#7184426 – SundayMonday 2011-08-25 02:32:08
看到这个答案在这里:How to create backBarButtomItem with custom view for a UINavigationController
你只需要之前设置backBarButtonItem
财产上的navigationController 推的viewController。在viewController的viewDidLoad
方法(例如)中设置backBarButtonItem
属性不起作用。
与iOS 5开始,这很简单:
[[UIBarButtonItem appearance]
setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button.png"]
forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
你可以放置在您的应用程序委托,它会设置背景图片的所有后退按钮的应用程序(用于控制状态和酒吧指标, 当然)。
这不隐藏后台标题 – user366584 2012-12-09 08:29:09
任何方式来隐藏后台标题? – ArdenDev 2013-04-04 02:31:00
这种方式背景宽度取决于标题的长度。 图像将根据标题的长度进行缩放。 – Add080bbA 2014-12-22 15:02:46
我从https://stackoverflow.com/a/16831482/171933重新发布我的解决方案:
我上UIViewController
创建一个简单的分类:
的UIViewController + ImageBackButton.h
#import <UIKit/UIKit.h>
@interface UIViewController (ImageBackButton)
- (void)setUpImageBackButton;
@end
的UIViewController + ImageBackButton.m
#import "UIViewController+ImageBackButton.h"
@implementation UIViewController (ImageBackButton)
- (void)setUpImageBackButton
{
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 34, 26)];
[backButton setBackgroundImage:[UIImage imageNamed:@"back_arrow.png"] forState:UIControlStateNormal];
UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
[backButton addTarget:self action:@selector(popCurrentViewController) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = barBackButtonItem;
self.navigationItem.hidesBackButton = YES;
}
- (void)popCurrentViewController
{
[self.navigationController popViewControllerAnimated:YES];
}
@end
现在,所有你需要做的就是#import UIViewController+ImageBackButton.h
在任的所有视图控制器或自定义基本视图控制器类,您的其他视图控制器继承并实现viewWillAppear:
方法:
- (void)viewWillAppear:(BOOL)animated
{
[self setUpImageBackButton];
}
这就是全部。现在你有一个图像后退按钮。没有边界。请享用!
[backButton addTarget:self.navigationController action:@selector(popViewControllerAnimated :) forControlEvents:UIControlEventTouchUpInside];不提供'动画'参数并且未定义。最好添加一个明确提供'动画'参数的方法 – 2013-05-30 10:48:59
@OrArbel谢谢你,你是对的。它按照它的方式工作,但明确地称之为更清晰。我编辑了代码:) – 2013-05-30 11:19:03
这很好,但如果隐藏后退按钮,将禁用滑动回去。所以国际海事组织你失去的比你获得的更多 – AppHandwerker 2015-08-07 13:51:21
是不是最简单的解决方案,只需从故事板中设计任意图像或颜色,然后将新操作拖动到控制器上即可?
Swift代码
@IBAction func backButton(sender: AnyObject) { self.navigationController?.popViewControllerAnimated(true) }
SO太棒了!我在2010年问了这个问题,现在我用Swift示例代码得到答案,并且建议使用Storyboard :) – pgb 2014-09-24 13:05:25
我不认为视图控制器本身应该知道它的后退按钮 根据OOP东西,这是在您的视图控制器插入containerViewController的责任,例如UINavigationController。在它
子类的NavigationController和超载超类方法是这样的:
@implementation STONavigationController
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[super pushViewController:viewController animated:animated];
if ([self.viewControllers indexOfObject:viewController] != NSNotFound &&
[self.viewControllers indexOfObject:viewController] > 0){
UIImage *img = [UIImage imageNamed:@"back-1"];
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, img.size.width * 2, img.size.height * 2)];
[backButton setBackgroundImage:img forState:UIControlStateNormal];
UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
[backButton addTarget:self action:@selector(popCurrentViewController) forControlEvents:UIControlEventTouchUpInside];
viewController.navigationItem.leftBarButtonItem = barBackButtonItem;
viewController.navigationItem.hidesBackButton = YES;
}
}
- (void)popCurrentViewController
{
[self popViewControllerAnimated:YES];
}
@end
约翰内斯Fahrenkrug的答案作品,但后面的图像会出现在一个非常有线位置。
在这里,我找到了一个更好的办法来定位图像在正确的地方:
确保你有一个大小为24x24背面影像(@ 1X),我把它叫做backImage
执行下面的代码当您的应用启动时
UINavigationBar.appearance().barTintColor = nil
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics: .Default)
我在didFinishLaunchingWithOptions上设置了BackButtonTitlePositionAdjustment,并且在一些屏幕中,我可以看到后退按钮标题在屏幕外显示动画:/ – 2017-07-12 12:55:20
由于@pgb建议您可以使用leftBarButtonItem而不是后退按钮项。并删除默认后退按钮项目设置为零如下;
navigationController?.navigationBar.backIndicatorImage = nil
navigationController?.navigationBar.backIndicatorTransitionMaskImage = nil
let button = UIButton.init(type: .custom)
button.imageView?.contentMode = UIViewContentMode.scaleAspectFit
button.setImage(UIImage.init(named: "top_back"), for: UIControlState.normal)
button.frame = CGRect.init(x: 0, y: 0, width: 75, height: 50)
button.addTarget(self, action: #selector(handleBackButton), for: .touchUpInside)
let barButton = UIBarButtonItem.init(customView: button)
self.navigationItem.leftBarButtonItem = barButton
我想我想'backBarButtonItem'。我想控制的是UIViewController在UINavigationController栈中被按下时后退按钮的样子。事实上,对'backBarButtonItem'的细微更改按预期工作,只是自定义视图不会粘住。 backBarButtonItem属性起作用 – pgb 2010-08-17 19:57:00
。只需在适当的时间设置它。 – SundayMonday 2011-08-25 02:31:16