UINavigationBar没有标题的自定义后退button

如何在iOS 7及以上版本中自定义导航后退button? (即只用箭头)

self.navigationItem.leftBarButtonItem = self.editButtonItem; 

我只是想知道如果他们有任何self.backButtonItem;

要么

像这样的东西?

 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBACK target:self action:@selector(back)]; 

这其实很简单,我是这么做的:

目标C

 // Set this in every view controller so that the back button displays back instead of the root view controller name self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; 

迅速

 self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.Plain, target:nil, action:nil) 

把这一行放在推送到堆栈的视图控制器中。 新推视图控制器返回button现在将显示你为initWithTitle,这在这种情况下是一个空string。

我发现一个简单的方法来使我的后退button与iOS单箭头。

让我们看看你有一个导航控制器从ViewB转到ViewA。 在IB中,selectViewA的导航栏,你应该看到这些选项:标题,提示和后退button。

ViewA导航栏选项

ViewA导航栏选项

诀窍是在前一个视图控制器(视图A)的选项中select您的命运视图控制器后退button标题(ViewB)。 如果你没有填写“后退button”的选项,iOS会自动把标题“后退”, 以前视图控制器的标题。 所以,你需要用一个空格来填充这个选项。

在“后退button”选项中填充空间

在“后退按钮”选项中填充空间

结果:

结果:

只需使用一个图像!

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"] style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)]; self.navigationItem.leftBarButtonItem = backButton; } 

ICON-Back.png

图标回

Icon-Back@2x.png

图标回@ 2X

Icon-Back@3x.png

图标回@ 23X

iOS7有新的界面规则,所以当你推UIView时,最好至less保留后退箭头。 以编程方式更改“后退”文本非常简单。 只要在推送视图之前添加此代码(或者如果您正在使用StoryBoards,请准备好关系):

 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil]; } 

这将改变默认的“返回”文本,但会保留iOS7风格的后退箭头。 在推送视图之前,您还可以更改后退箭头的色调颜色:

 - (void)viewDidLoad{ //NavBar background color: self.navigationController.navigationBar.barTintColor=[UIColor redColor]; //NavBar tint color for elements: self.navigationController.navigationBar.tintColor=[UIColor whiteColor]; } 

希望这可以帮助你!

没有什么你需要做的。 你可以通过故事板本身达到相同的效果。

只要去根控制器,给一个空间。 记住不要你想要没有标题的后退button的控制器,而是根控制器。

根据下面的图片。这适用于iOS 7和iOS 8

虽然Kyle Begeman的答案完全可以做到这一点,但是在每个视图控制器中都有这样的代码是非常烦人的。 我结束了一个简单的UINavigationItem类别。 当心,这里是龙! 对不起,我的意思是说,

 #import <objc/runtime.h> @implementation UINavigationItem (ArrowBackButton) static char kArrowBackButtonKey; + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem)); Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem)); method_exchangeImplementations(m1, m2); }); } - (UIBarButtonItem *)arrowBackButton_backBarButtonItem { UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem]; if (item) { return item; } item = objc_getAssociatedObject(self, &kArrowBackButtonKey); if (!item) { item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL]; objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return item; } @end 

编辑:2014-04-09:当我获得了声誉,我感到抱歉,因为我不再使用这个技巧。 我推荐凯尔的答案。 另外请注意, self.navigationItem.backBarButtonItemself不是显示后退button的视图控制器,而是前一个视图控制器要返回。

如果你不需要为前一个视图控制器设置标题文本,只需用空白string填充标题;

 self.navigationItem.title = @""; [self.navigationController pushViewController:viewController animated:YES]; 

这将防止在推送的视图控制器上显示“背”。

编辑:即使你使用非空白标题文本,在viewWillAppear:设置以前的视图控制器的标题viewWillAppear:除了标题可以闪烁视图控制器popup时闪烁的作品。 我认为“叽叽喳喳应用程序”似乎做了更细微的黑客,以避免闪烁。

这个工作,但是它会删除以前的项目的标题,即使你回到它:

 self.navigationController.navigationBar.topItem.title = @""; 

只需在推送的View Controller的viewDidLoad上设置此属性即可。

您无法以您想要的方式访问导航backButtonItem,您需要创build自己的后退button,如下所示:

 - (void)loadView { [super loadView]; UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)]; [backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal]; [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; } 

当然,

 - (void) popVC{ [self.navigationController popViewControllerAnimated:YES]; } 

从iOS6简单的黑客也适用于iOS7:

 [UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault]; 

编辑:不要使用这个黑客。 请参阅评论的细节。

目标:将 UINavigationBar上的所有后退button自定义为白色图标

步骤: 1.在AppDelete的“didFinishLaunchingWithOptions”方法中:

 UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [UINavigationBar appearance].tintColor = [UIColor whiteColor]; [UINavigationBar appearance].backIndicatorImage = backBtnIcon; [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon; }else{ UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; } 

2.在普通超级ViewController类的viewDidLoad方法中:

  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; [self.navigationItem setBackBarButtonItem:backItem]; }else{ //do nothing } 

这是我如何做到的,也是最简单,最有效的方法。

如果embedded在Navigation Controller这将起作用

Swift 3

viewDidLoad我把这个添加到你想要的后退button只是箭头的视图控制器。

 if let topItem = self.navigationController?.navigationBar.topItem { topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } 

这与@Kyle Begeman的答案的区别在于你在视图控制器上调用了这个方法,你希望后退button只是箭头,而不是在推栈视图控制器上。

你可以使用这个。 这完全适用于我只需添加一个UIButton作为UIBarButtonItem UIBarButtonItem

尝试下面的代码

  self.navigationItem.leftBarButtonItem=[self backButton]; - (UIBarButtonItem *)backButton { UIImage *image = [UIImage imageNamed:@"back-btn.png"]; CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height); UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame]; [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [button setImage:image forState:UIControlStateNormal]; UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button]; return item; } 

所有的答案都不能解决问题。 在每个视图控制器中设置返回button标题并向标题添加偏移仍然使下一个视图控制器标题向右移动是不可接受的。

这里是使用方法swizzling的方法,只是创build新的扩展到UINavigationItem

 import UIKit extension UINavigationItem { public override class func initialize() { struct Static { static var token: dispatch_once_t = 0 } // make sure this isn't a subclass if self !== UINavigationItem.self { return } dispatch_once(&Static.token) { let originalSelector = Selector("backBarButtonItem") let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem) let originalMethod = class_getInstanceMethod(self, originalSelector) let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if didAddMethod { class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) } else { method_exchangeImplementations(originalMethod, swizzledMethod) } } } // MARK: - Method Swizzling struct AssociatedKeys { static var ArrowBackButtonKey = "noTitleArrowBackButtonKey" } func noTitleBackBarButtonItem() -> UIBarButtonItem? { if let item = self.noTitleBackBarButtonItem() { return item } if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem { return item } else { let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil) objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) return newItem } } } 

创build一个你想为你的根视图控制器的标题的UILabel ,并将其分配给视图控制器的navigationItem.titleView

现在将标题设置为一个空string,并且您推送的下一个视图控制器将具有没有文本的后退button。

 self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above self.title = @""; 
  // add left bar button item try this code: - (void)viewDidLoad { [super viewDidLoad]; UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"]; CGRect backframe = CGRectMake(250, 9, 15,21); UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe]; [backbutton setBackgroundImage:image_back forState:UIControlStateNormal]; [backbutton addTarget:self action:@selector(Btn_back:) forControlEvents:UIControlEventTouchUpInside]; [backbutton setShowsTouchWhenHighlighted:YES]; UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton]; self.navigationItem.leftBarButtonItem=backbarbutton; [backbutton release]; } -(IBAction)Btn_back:(id)sender { [self.navigationController popViewControllerAnimated:YES]; } 

将标题置空

 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)]; [backButton setTintColor:Color_WHITE]; [self.navigationItem setBackBarButtonItem:backButton]; 

改变后面的图像

  UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [UINavigationBar appearance].backIndicatorImage = backImg; [UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg; 

自iOS 5以来,我一直在使用这个解决scheme,没有任何问题。 我在我的视图控制器中调用了一个实用函数。 你需要在viewDidLoad中或之后的任何一点。

 void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text) { if(! viewController.navigationItem.backBarButtonItem) { viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:text style:UIBarButtonItemStylePlain target:nil action:nil]; } else { viewController.navigationItem.backBarButtonItem.title = text; } } 

在某些情况下,导航项目可能已经存在,在其他情况下,它需要被创build。 这就解决了这两种情况,而不会弄乱导航项目标题。 它允许您通过简单地传入@""来删除标题。

我在viewDidLoad中应用下面的代码,它工作:

  // this will set the back button title self.navigationController.navigationBar.topItem.title = @"Test"; // this line set the back button and default icon color //[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]]; this line change the back default icon to your custom icon [[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]]; 

只是为了更新我使用vector图标

您可以inheritanceUINavigationController,将自己设置为委托,并在委托方法navigationController:willShowViewController:animated:设置backBarButtonItem navigationController:willShowViewController:animated:

 @interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate> @end @implementation Custom_NavigationController - (void)viewDidLoad { [super viewDidLoad]; self.delegate = self; } #pragma mark - UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end 

如果您在导航控制器中有两个ViewController(FirstVC,SecondVC)embedded,并且您希望SecondVC中只有后退箭头。

你可以试试这个在FirstVC的ViewDidLoad中

 override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) } 

然后当你进入SecondVC时,你会看到只有后退箭头

如果您设置了NavigationBar的tintColor,添加一个不带标题的自定义后退button图像,色调颜色将反映图像的颜色。 请按照这个苹果文件链接。

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

 UINavigationItem *navItem = [[UINavigationItem alloc] init]; navBar.tintColor = self.tintColor; UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"]; myImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)]; navItem.leftBarButtonItem = leftButton; navBar.items = @[ navItem ]; 

检查这个答案

如何更改UINavigationController后退button名称?

title文本设置为一个空格,如下所示

 title = " " 

没有足够的声誉来添加评论:)

在第一个ViewController的prepareForSegue:方法中,你将视图标题设置为@“”,所以当下一个视图被按下时,它将显示前面的ViewController标题,它将是@“”。

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ self.navigationItem.title = @" "; } 

唯一的问题是,当你点击后退button时,以前的视图将不会有标题,所以你可以在viewWillAppear上再次添加它:

 -(void)viewWillAppear:(BOOL)animated{ self.navigationItem.title = @"First View Title"; } 

我不太喜欢这个解决scheme,但它的工作原理,我没有find其他的方法来做到这一点。

要添加到托马斯C的上面的答案 ,有时把一个单一的空间不起作用,你必须不断增加空格。

空栏按钮

当您在“导航项目”下方看到“Bar Button Item – ”时,您将会知道您成功了。 这是在文档大纲(编辑 – >显示文档大纲)。 一旦你看到上面的图片,你可以删除一些空格,看看它是否仍然有效。

 - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Custom initialization self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } return self; } 

就像Kyle Begeman所做的那样,您可以在您的根视图控制器中添加上面的代码。 所有的子视图控制器将被应用。 另外,在initWithCoder:方法中添加这个,你可以在xib,storyboard或基于代码的方法中应用根视图控制器的样式。

唯一对我有用的方法是:

 navigationController?.navigationBar.backItem?.title = "" 

更新:

当我将segueanimation标志改为true(以前是false)时,唯一对我有用的方法是:

 navigationController?.navigationBar.topItem?.title = "" 
  1. 将新的UIBarButtonItem添加到UINavigationItem左侧
  2. 更改UIBarButtonItem如何使用
  3. 现在,单击UINavigationItem并从bar outlets向左滑动barBackButtonItem到UIBarButtonItem

在这里输入图像说明

您可以将该类别放在AppDelegate.m文件中。 从UINavigation中的所有默认后退button中删除文本 。 只有箭头“<”或设置自定义图像,如果你需要。

Objective-C的:

@结束

  @implementation UINavigationItem(扩展)

 - (UIBarButtonItem *)backBarButtonItem {

     return [[UIBarButtonItem alloc] initWithTitle:@“”style:UIBarButtonItemStylePlain target:nil action:nil];
 }

 @结束 

将button项目标题设置为空string。

[self.navigationController.navigationBar.backItem setTitle:@“”];