删除iOS UIBarButtonItem的标题文本
我想要做的是从UIBarButtonItem
的“后退”button中删除文本,只留下导航栏上的蓝色人字形。 请记住,我正在为iOS 7开发。我尝试了几种方法,包括但不限于:
这是我不喜欢的图像方法(图像看起来不合适):
UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)]; self.navigationItem.leftBarButtonItem = barBtnItem;
我尝试过的另一种方法是,这根本不起作用(没有任何显示):
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init]; barBtn.title=@""; self.navigationItem.leftBarButtonItem=barBtn;
我想要实现的就像iOS 7音乐应用程序中的后退button,只有一个人字形。
谢谢。
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
然后你可以删除后退button项目的标题。
如果您使用故事板,则可以使用空格设置导航属性检视器后退button。
要设置视图控制器的后退button标题而不更改其标题使用:
Objective-C的:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
迅速:
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
要清楚的是,这是在视图控制器上完成的,如果你点击后退button,你会看到。 即,而不是看到“<设置”你想看到“<”然后在你的SettingsViewController你会把这个在你的init
。 那么当你看着视图控制器本身时,你不会看到标题中没有显示的任何问题。
如果您正在使用故事板,则可以转到ViewController的Navigation Item
Attributes Inspector
(单击导航栏),并将Back Button
属性设置为“”(一个空格字符)。 这将设置后退button标题为一个空格字符,使雪佛龙可见。 不需要混淆代码。
请注意,这将为Back Button
设置Back Button
标题,该 Back Button
标题将从前一个button上移到该视图控制器 ,而不是将在此控制器内显示的Back Button
!
这对我来说只显示没有任何文字的“背”字形:
self.navigationController.navigationBar.topItem.title = @"";
在viewDidLoad
controller的viewDidLoad
中设置这个属性来呈现导航栏,它会执行这个技巧。
注意:我只在iOS 7中进行了testing,这在问题的范围之内。
当你设置button的标题时,使用@“”而不是@“”。
– 编辑 –
当您尝试其他string时是否有任何变化? 我成功地使用了下面的代码:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil]; [[self navigationItem] setBackBarButtonItem:backButton];
backString是一个variables,设置为@“”或@“后退”,这取决于我是否在iOS 7或更低的版本。
有一件事要注意的是,这个代码不是在我想要自定义后退button的页面的控制器中。 它实际上是在导航堆栈之前的控制器中。
有时在上下文中看到事物是有帮助的。 这是一个隐藏“后退”文本,但仍然显示箭头的最小项目。
故事板
从“显示第二个视图控制器”button到第二个视图控制器有一个show segue。
我还添加了一个导航项目到第二个视图控制器,以便它将有一个标题。 这是可选的。 它不影响后退button。
码
FirstViewController.swift
import UIKit class FirstViewController: UIViewController { @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) { // hide the back button text navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) } }
SecondViewController.swift
import UIKit class SecondViewController: UIViewController { // Nothing at all needed here }
备用方法(仅限IB,无代码)
在故事板上select第一个视图控制器(而不是第二个)的导航项目。 只需input后退button文本的空间。
self.navigationController.navigationBar.topItem.title = @"";
在iOS7上,Apple向UINavigationBar,'backIndicatorTransitionMaskImage'和'backIndicatorImage'引入了两个新属性。
通过简单地调用一次:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]]; [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];
它将呈现自定义图像,而不是默认的V形字形,inheritancekeyWindow的色调。
为了删除标题,我会build议Kamaros的答案。 记得在视图控制器上调用这个代码来推动你的新视图控制器。 删除iOS UIBarButtonItem的标题文本
我没有提供很多成功的答案,但我确实find了一个非常简单的解决方法。 在你的故事板中,你可以点击你的UIViewController的导航条目并设置后退button文本。 我把它设置为一个单独的空间,它给了我我正在寻找的行为。
这在iOS10中适用于我。 从视图控制器的viewDidLoad调用它。
self.navigationController?.navigationBar.topItem?.title = ""
简单的解决这个问题,在iOS7和6上工作,是在viewDidLoad中设置自定义标题视图:
- (void)viewDidLoad { [super viewDidLoad]; UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; titleLabel.text = self.title; titleLabel.backgroundColor = [UIColor clearColor]; [titleLabel sizeToFit]; self.navigationItem.titleView = titleLabel; }
然后,在viewWillAppear:你可以安全地调用
self.navigationController.navigationBar.topItem.title = @" ";
由于您的标题视图是自定义视图,因此在导航堆栈中移回时不会被覆盖。
其实你可以用一个技巧来做到这一点:
覆盖UINavigationBar
类并添加以下代码行:
- (void)layoutSubviews{ self.backItem.title = @""; [super layoutSubviews]; }
然后用这个自定义的UINavigationBar类来初始化你的UINavigationController
..等等UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];
希望这可以帮助
在第一个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其他的方式来做到这一点。
我可以用DonnaLea的答案拼凑一些东西。 这是如何解决scheme出现在我的UIViewController子类:
var backItemTitle:String? override func viewDidLoad() { super.viewDidLoad() //store the original title backItemTitle = self.navigationController?.navigationBar.topItem?.title //remove the title for the back button navigationController?.navigationBar.topItem?.title = "" } override func willMoveToParentViewController(parent: UIViewController?) { super.willMoveToParentViewController(parent) if parent == nil { //restore the orignal title navigationController?.navigationBar.backItem?.title = backItemTitle } }
原来的答案的问题是,当你回到它时,它从控制器中删除标题。 试图在viewWillDisappear中重置标题在转换过程中已经太迟了; 它导致标题回来,而不是很好的animation。 然而,willMoveToParentViewController更快地发生,并允许正确的行为。
警告:我只用普通的UINavigationController push / pop来testing。 在其他情况下可能会有额外的意外行为。
没有答案帮助我。 但一个窍门 – 我只是在按下之前清除了推送的视图控制器(后退button所在的位置)的标题。
所以当前一个视图没有标题时,在iOS 7上,后退button只有一个箭头,没有文字。
在观点上,我把原来的标题放回去了。
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [UIColor clearColor],UITextAttributeTextColor, nil]; [[UIBarButtonItem appearance] setTitleTextAttributes:attributes forState:UIControlStateNormal];
我遇到了同样的问题,我这样做了。
– 编辑 –
这是一个解决scheme,当你真的要删除所有的UIBarbuttonItem标题文本。 如果您只想删除后栏button项目的标题,则没有一个简单方便的解决scheme。 在我的情况下,因为我只有很less的UIBarButtonItems需要显示标题文本我只是改变了这些特定的button的titleTextAttributes。 如果你想更具体的使用下面的代码,这将只会改变导航栏button:
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [UIColor clearColor],UITextAttributeTextColor, nil]; [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes forState:UIControlStateNormal];
这是使用子类navigationController
删除“后退”。
我正在使用它来永久删除它,通过应用程序。
//.h @interface OPCustomNavigationController : UINavigationController @end //.m @implementation OPCustomNavigationController - (void)awakeFromNib { [self backButtonUIOverride:YES]; } - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { [self backButtonUIOverride:NO]; [super pushViewController:viewController animated:animated]; } - (void)backButtonUIOverride:(BOOL)isRoot { if (!self.viewControllers.count) return; UIViewController *viewController; if (isRoot) { viewController = self.viewControllers.firstObject; } else { int previousIndex = self.viewControllers.count - 1; viewController = [self.viewControllers objectAtIndex:previousIndex]; } viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt]; [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont systemFontOfSize:1]} forState:UIControlStateNormal];
SWIFT 3
navigationController?.navigationBar.topItem?.title = ""
这是我在做我,这是更简单的删除后退button的标题
override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar?.backItem?.title = "" }
你也可以使用这个:
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init]; temporaryBarButtonItem.title = @""; self.navigationItem.backBarButtonItem = temporaryBarButtonItem; [temporaryBarButtonItem release];
这对我有用
case : <Back as < override func viewWillAppear(animated: Bool) { navigationController!.navigationBar.topItem!.title = "" }
隐藏导航栏的后退button标题
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init]; barButton.title = @""; // blank or any other title self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
完美的解决scheme
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal) UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted) return true }
我为UINavigationController
创build一个自定义的类,并将其应用到我的应用程序中的所有导航控制器。 在这个自定义的UINavigationController
类中,一旦视图加载,我将UINavigationBar
委托设置为self
。
- (void)viewDidLoad { self.navigationBar.delegate = self; }
然后我实现委托方法:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item { // This will clear the title of the previous view controller // so the back button is always just a back chevron without a title if (self.viewControllers.count > 1) { UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)]; previousViewController.title = @""; } return YES; }
这样,我只需将我的自定义类分配给所有导航控制器,并清除所有后退button的标题。 为了清楚起见,我总是在viewWillAppear
设置所有其他视图控制器的标题,以便在视图出现之前始终更新标题(以防被这样的技巧移除)。
如果像我一样,你使用的是自定义视图而不是UINavigationBar
并且你被后退button卡住了,那么你必须做一些工作,感觉有点乱七八糟。
[self.navigationController.navigationBar setHidden:NO]; self.navigationController.navigationBar.topItem.title = @""; [self.navigationController.navigationBar setHidden:YES];
看起来如果它没有呈现,那么无论它会尝试显示一个标题,这意味着它显示,然后隐藏在绘制之前,并解决问题。
我已经做了一个非常简单的零configuration类别来隐藏所有后退button标题通过了应用程序,你可以在这里检查出来。 这个问题已经接受了答案,但是对于其他人可能会有所帮助。
编辑:
.h文件
#import <UIKit/UIKit.h> @interface UINavigationController (HideBackTitle) extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector); @end
.m文件
#import "UINavigationController+HideBackTitle.h" #import <objc/runtime.h> @implementation UINavigationController (HideBackTitle) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ PJSwizzleMethod([self class], @selector(pushViewController:animated:), @selector(pj_pushViewController:animated:)); }); } - (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated { UIViewController *disappearingViewController = self.viewControllers.lastObject; if (disappearingViewController) { disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } if (!disappearingViewController) { return [self pj_pushViewController:viewController animated:animated]; } return [self pj_pushViewController:viewController animated:animated]; } @end void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector) { Method originalMethod = class_getInstanceMethod(cls, originalSelector); Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector); BOOL didAddMethod = class_addMethod(cls, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(cls, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } }
我无法使用Guto Araujo的navigationBar.topItem.title = @"";
不过,我可以通过在我的视图控制器的init
方法中设置self.title = @""
来获得所需的效果。 (在init
设置很重要, viewDidLoad
不起作用。)
我列出了迄今为止为我工作的解决scheme。
override func viewDidLoad() { super.viewDidLoad() self.navigationController?.navigationBar.topItem?.title = "" // 1 let barAppearace = UIBarButtonItem.appearance() barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default) // 2 UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal) //3 UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted) //4 }
只需input一个单一的空间为后退button导航项目工作!