Suppression du titre d'un iOS UIBarButtonItem
ce que je voulais faire , c'est supprimer le texte du bouton" Back "d'un UIBarButtonItem
, en ne laissant que le chevron bleu sur la barre de navigation. Gardez à l'esprit que je développe pour iOS 7. J'ai essayé plusieurs méthodes, y compris, mais pas limité à:
C'est la méthode de l'image, que je n'aime pas (l'image semblait hors de propos):
UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;
une autre méthode que j'ai essayé était celle-ci, qui n'a tout simplement pas fonctionné (rien n'a été affiché):
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;
ce que je voulais réaliser est quelque chose comme les boutons arrière trouvés dans l'application de musique iOS 7, qui ne comportait qu'un seul chevron.
Merci.
30 réponses
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
forBarMetrics:UIBarMetricsDefault];
ensuite, vous pouvez supprimer le titre de l'élément de bouton arrière.
si vous utilisez Storyboard, vous pouvez définir les attributs de navigation inspecteur bouton arrière avec l'espace.
pour régler le titre du bouton arrière d'un contrôleur de vue sans changer son titre utilisation:
Objectif-C:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
Swift:
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
pour être clair, ceci est fait sur le contrôleur de vue que vous verriez si vous appuyez sur le bouton arrière. c'est-à-dire qu'au lieu de voir '< Settings' vous voulez juste voir '<' alors sur votre SettingsViewController vous le mettriez dans votre init
. Puis vous ne recevez aucun des problèmes du titre ne montrant pas quand vous regardez le contrôleur de vue lui-même.
si vous utilisez des Storyboards, vous pouvez aller à Attributes Inspector
du ViewController Navigation Item
(cliquez sur Navigation Bar
) et définir la Back Button
propriété à "" (un caractère d'espace). Cela positionnera le titre du bouton arrière sur un caractère d'espace, laissant le chevron visible. Pas besoin de jouer avec le code.
notez que cela mettra Back Button
titre pour le bouton arrière qui va suivre à cette Visualisez le contrôleur à partir de celui qui a été poussé dessus, pas pour le Back Button
qui sera affiché à l'intérieur de ce contrôleur!
cela fonctionne pour moi d'afficher juste le chevron "arrière" sans aucun texte:
self.navigationController.navigationBar.topItem.title = @"";
définit cette propriété dans viewDidLoad
du contrôleur de vue présentant la barre de navigation et il fera l'affaire.
Note: Je ne l'ai testé que dans iOS 7, ce qui est dans le cadre de la question.
lorsque vous définissez le titre du bouton, utilisez @ " au lieu de @"".
-- EDIT--
est-ce que quelque chose change quand vous essayez d'autres cordes? J'utilise moi-même le code suivant avec succès:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
backString est une variable qui est définie à @ ""ou @ "Back", selon que je suis sur iOS 7 ou une version inférieure.
une chose à noter est que ce code n'est pas dans le contrôleur pour la page que je veux personnaliser le bouton retour pour. Il est en fait dans le contrôleur avant sur la pile de navigation.
il est Parfois utile de voir les choses dans leur contexte. Voici un projet minimal qui cache le texte "back" mais qui montre quand même la flèche.
Storyboard
il y a une séquence de show à partir du bouton" Show Second View Controller " vers le contrôleur de second view.
j'ai aussi ajouté un élément de Navigation au contrôleur de deuxième vue pour qu'il ait un titre. Cette option est facultative. Il n'a pas d'incidence sur le bouton retour.
Code
First ViewController.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
}
méthode alternative (IB seulement, pas de code)
sur le storyboard sélectionnez l'élément de navigation pour le premier voir contrôleur (pas le deuxième). Entrez juste un espace pour le texte du bouton de retour.
self.navigationController.navigationBar.topItem.title = @"";
sur iOS7, Apple a introduit deux nouvelles propriétés à UINavigationBar, "backIndicatorTransitionMaskImage" et "backIndicatorImage".
en appelant une seule fois:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];
il affichera une image personnalisée à la place du chevron glyph par défaut, héritant de la teinte de keyWindow.
et pour enlever le titre, Je suggérerai la réponse de Kamaros. Rappelez - vous d'appeler ce code sur le contrôleur de vue qui pousse votre nouveau contrôleur de vue. suppression du titre d'un iOS UIBarButtonItem
Je n'ai pas eu beaucoup de succès avec les réponses fournies, mais j'ai trouvé un travail vraiment simple autour. Dans votre storyboard, vous pouvez cliquer sur L'élément de Navigation de votre UIViewController et régler le texte du bouton back. Je l'ai mis dans un seul espace et il m'a donné le comportement que je cherchais.
cela a fonctionné pour moi dans iOS10. Appelez cela depuis viewDidLoad du contrôleur de vue.
self.navigationController?.navigationBar.topItem?.title = ""
la solution Simple à ce problème, en travaillant sur iOS7 ainsi que 6, est de définir custom title view dans 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;
}
puis, dans viewWillAppear: vous pouvez appeler en toute sécurité
self.navigationController.navigationBar.topItem.title = @" ";
parce que votre vue titre est une vue personnalisée, elle ne sera pas écrasée lorsque vous reviendrez dans la pile de navigation.
en fait, vous pouvez le faire avec juste un tour:
remplacer UINavigationBar
classe et ajouter cette ligne de code:
- (void)layoutSubviews{
self.backItem.title = @"";
[super layoutSubviews];
}
alors initialisez votre UINavigationController
avec cette classe personnalisée UINavigationBar.. etc. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];
Espérons que cette aide
dans la prépareforsegue: méthode de votre premier ViewController, vous définissez le titre des vues à@"", de sorte que lorsque la prochaine vue est poussée il affichera le titre du ViewController précédent qui sera@"".
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
le seul problème avec ceci est que lorsque vous appuyez sur le bouton arrière votre vue précédente n'aura pas de titre, donc vous pouvez l'ajouter à nouveau sur viewWillAppear:
- (void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
je n'aime pas beaucoup cette solution, mais ça fonctionne et je n'ai pas trouver d'autre moyen de le faire.
J'ai pu assembler quelque chose en utilisant la réponse de DonnaLea. C'est ainsi que la solution apparaît dans ma sous-classe 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
}
}
le problème avec la réponse d'origine est qu'elle supprime le titre du contrôleur lorsque vous pop de nouveau à elle. Tenter de réinitialiser le titre dans viewWillDisappear est trop tard dans le processus de transition; il provoque le titre de revenir en arrière au lieu de bien animer. Cependant le willMoveToParentViewController arrive plus tôt et permet de corriger le comportement.
mise en garde: je l'ai seulement testé avec un push / pop UINavigationController normal. Il pourrait y avoir un comportement inattendu supplémentaire dans d'autres situations.
aucune des réponses ne m'a aidé. Mais un truc a fait - je viens d'enlever le titre du contrôleur de vue qui a poussé (où le bouton arrière va) juste avant de le pousser.
Ainsi, lorsque la vue précédente n'a pas de titre, sur iOS 7 le bouton Précédent n'aura qu'une flèche, sans texte.
Sur viewWillAppear
de la poussée, j'ai remis le titre original.
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
j'avais le même problème et je l'ai fait de cette façon.
-- EDIT--
c'est une solution quand vous voulez vraiment supprimer le texte de titre de tous UIBarbuttonItem. Si vous voulez seulement supprimer le titre de l'article de barre de dos, il n'y a aucune solution pratique simple. Dans mon cas, puisque je n'ai que quelques UIBarButtonItems qui ont besoin de montrer le texte du titre, je viens de changer les titleTextAttributes de ces boutons spécifiques. Si vous voulez utilisez plus spécifiquement le code ci-dessous, qui ne changera que les boutons de barre de navigation:
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
la présente sous-classe navigationController
supprime le"retour".
j'utilise ceci pour l'enlever, de façon permanente à travers l'application.
//.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 = ""
Hide Back Button titre de la barre de Navigation
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Voici ce que je fais moi, ce qui est plus simple pour supprimer le titre de bouton de retour
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar?.backItem?.title = ""
}
Vous pouvez également utiliser ceci:
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];
Cela fonctionne pour moi
case : <Back as <
override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
}
solution Parfaite à l'échelle mondiale
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
}
je crée une classe personnalisée pour UINavigationController
et l'applique à tous les contrôleurs de navigation dans mon application. À l'intérieur de cette custom UINavigationController
classe I régler le UINavigationBar
délégué à self
une fois les charges de vue.
- (void)viewDidLoad {
self.navigationBar.delegate = self;
}
puis je mets en œuvre la méthode du délégué:
- (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;
}
de cette façon, j'assigne simplement ma classe personnalisée à tous mes contrôleurs de navigation et cela efface le titre de tous les boutons arrière. Et juste pour plus de clarté, j' toujours régler le titre de tous mes autres contrôleurs de vue à l'intérieur de viewWillAppear
de sorte que le titre soit toujours mis à jour juste avant l'apparition de la vue (au cas où il serait supprimé par des trucs comme celui-ci).
si comme moi vous utilisez une vue personnalisée à la place du UINavigationBar
et vous êtes coincé avec le bouton arrière alors vous devez faire un peu de travail qui se sent un peu cludgey.
[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];
il semble que si elle n'est pas présentée alors peu importe ce qu'elle va essayer de montrer un titre, cela signifie qu'elle est montrée puis cachée avant qu'elle soit dessinée et résout le problème.
extension UIViewController{
func hideBackButton(){
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
dans iOS 11 Vous pouvez utiliser le code suivant pour cacher le titre du bouton Précédent:
Swift:
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)
ce code ne supprime pas le titre de la barre de navigation, mais le rend juste transparent, le bouton de retour conserve encore de l'espace pour le titre. Si vous avez besoin d'avoir plus d'espace pour afficher le contrôleur de titre, alors vous devez utiliser une autre solution.
C'est une meilleure solution.
une autre solution est dangereuse parce qu'elle est bidon.
extension UINavigationController {
func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
pushViewController(viewController, animated: animated)
}
}
Swift 3.1 Vous pouvez le faire en implémentant la méthode delegate de UINavigationController. Il va cacher le titre avec le bouton de retour seulement, nous aurons toujours l'image de la flèche de retour et la fonctionnalité par défaut.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}