2010-08-17 151 views
17

对于我正在开发的应用程序,我需要在导航栏中显示自定义后退按钮。我有按钮的资产为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]; 

}

,自定义按钮没有显示出来,而是我得到的标准的后退按钮,里面有这个视图控制器的标题。

事情我已经尝试过:

  1. 再次检查,确认按钮backButton正确创建的,通过将其添加到视图层级结构。它正确显示。
  2. 以相同的方法,更改navigationItemtitle属性,并确认它改变(如预期)我的后退按钮的内容。

任何人都可以发现我做错了什么吗?有没有人成功地将自定义图像用作UINavigationController的后退按钮?

回答

5

backBarButtonItem属性按预期工作,但它总是会根据导航栏色调颜色添加其标准按钮形状和颜色。

您可以自定义文字,但不能替换图像。

Andrew Pouliot建议的一种解决方法是使用leftBarButtonItem代替,但我坚持使用标准按钮。

3

令人困惑backBarButtonItem不是你要找的。

它只是控制下一个视图控制器的后退按钮上的标题。你想要的是将leftBarButtonItem设置为您的自定义后退按钮。

+3

我想我想'backBarButtonItem'。我想控制的是UIViewController在UINavigationController栈中被按下时后退按钮的样子。事实上,对'backBarButtonItem'的细微更改按预期工作,只是自定义视图不会粘住。 backBarButtonItem属性起作用 – pgb 2010-08-17 19:57:00

+1

。只需在适当的时间设置它。 – SundayMonday 2011-08-25 02:31:16

0

只需创建一个UIBarButtonItem而不是嵌入UIButtonUIBarButtonItem。工作正常!

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"button_back.png"] style:UIBarButtonItemStyleBordered target:nil action:nil]; 

self.navigationItem.backBarButtonItem = backButton; 
+1

这不起作用。仍然显示后退按钮背景图像(除非您使用的图像大于默认后退按钮图像) – probablyCorey 2011-05-12 01:15:49

+0

http:// stackoverflow。com/questions/526520/how-to-create-backbarbuttomitem-with-custom-view-for-a-uinavigationcontroller/7184426#7184426 – SundayMonday 2011-08-25 02:32:08

18

与iOS 5开始,这很简单:

[[UIBarButtonItem appearance] 
      setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button.png"] 
      forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

你可以放置在您的应用程序委托,它会设置背景图片的所有后退按钮的应用程序(用于控制状态和酒吧指标, 当然)。

+27

这不隐藏后台标题 – user366584 2012-12-09 08:29:09

+5

任何方式来隐藏后台标题? – ArdenDev 2013-04-04 02:31:00

+1

这种方式背景宽度取决于标题的长度。 图像将根据标题的长度进行缩放。 – Add080bbA 2014-12-22 15:02:46

13

我从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]; 
} 

这就是全部。现在你有一个图像后退按钮。没有边界。请享用!

+0

[backButton addTarget:self.navigationController action:@selector(popViewControllerAnimated :) forControlEvents:UIControlEventTouchUpInside];不提供'动画'参数并且未定义。最好添加一个明确提供'动画'参数的方法 – 2013-05-30 10:48:59

+0

@OrArbel谢谢你,你是对的。它按照它的方式工作,但明确地称之为更清晰。我编辑了代码:) – 2013-05-30 11:19:03

+1

这很好,但如果隐藏后退按钮,将禁用滑动回去。所以国际海事组织你失去的比你获得的更多 – AppHandwerker 2015-08-07 13:51:21

3

是不是最简单的解决方案,只需从故事板中设计任意图像或颜色,然后将新操作拖动到控制器上即可?

Swift代码

@IBAction func backButton(sender: AnyObject) { 
    self.navigationController?.popViewControllerAnimated(true) 
} 
+3

SO太棒了!我在2010年问了这个问题,现在我用Swift示例代码得到答案,并且建议使用Storyboard :) – pgb 2014-09-24 13:05:25

1

我不认为视图控制器本身应该知道它的后退按钮 根据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 
1

约翰内斯Fahrenkrug的答案作品,但后面的图像会出现在一个非常有线位置。

在这里,我找到了一个更好的办法来定位图像在正确的地方:

确保你有一个大小为24x24背面影像(@ 1X),我把它叫做backImage

执行下面的代码当您的应用启动时

UINavigationBar.appearance().barTintColor = nil 
UINavigationBar.appearance().backIndicatorImage = backImage 
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage 
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics: .Default) 
+0

我在didFinishLaunchingWithOptions上设置了BackButtonTitlePositionAdjustment,并且在一些屏幕中,我可以看到后退按钮标题在屏幕外显示动画:/ – 2017-07-12 12:55:20

0

由于@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 
相关问题