Comment puis-je masquer le texte du bouton Retour d'un contrôleur UINavigation? Je n’aurai que le "<" et non le "<Back"
Comment puis-je masquer le texte du bouton Retour d'un contrôleur UINavigation? Je n’aurai que le "<" et non le "<Back"
Réponses:
Dans le générateur d'interface , vous pouvez sélectionner l'élément de navigation du contrôleur précédent et changer la Back Button
chaîne en ce que vous souhaitez que le bouton de retour apparaisse. Si vous voulez qu'il soit vide, par exemple, mettez simplement un espace.
Vous pouvez également le modifier avec cette ligne de code:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Ou dans Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
est déjà vide dans IB, ajoutez simplement un espace pour vous déplacer Back
et affichez simplement la flèche.
Vous pouvez également le faire via un storyboard. Dans l'inspecteur d'attributs de l'élément de navigation du contrôleur précédent, vous pouvez définir "" dans le champ du bouton Retour. Reportez-vous à l'image ci-dessous. Remplacez "Votre titre ici" par "". En faisant cela, vous obtiendrez le résultat souhaité. Vous n'avez plus besoin de jouer avec le «titre».
Vous pouvez utiliser par programme
[self.navigationItem.backBarButtonItem setTitle:@" "];
où self fait référence au contrôleur qui pousse le contrôleur View souhaité.
Exemple de barre de navigation avant, après
Avant
Après
backBarButtonItem
programme ne fonctionne pas, mais la configuration via le storyboard fonctionne.
Vous pouvez implémenter UINavigationControllerDelegate
comme ceci:
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem
est nil
par défaut et affecte le prochain contrôleur poussé, donc vous le définissez simplement pour tous les contrôleurs
Définir le titre du bouton de retour sur @""
ou nil
ne fonctionnera pas. Vous devez définir le bouton entier vide (sans titre ni image):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Cela devrait être fait sur le contrôleur de vue qui se trouve au-dessus de votre contrôleur de vue dans la pile de navigation (c'est-à-dire à partir de l'endroit où vous naviguez vers votre VC via la pushViewController
méthode)
Une autre solution à ce problème pour les situations où vous avez beaucoup de contrôleurs de vue consiste à utiliser un UIAppearance
proxy pour masquer efficacement le texte du titre du bouton de retour comme ceci:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Cette solution rendra le texte sous la forme d'un petit point clair, similaire à la définition manuelle du titre du bouton de retour sur @" "
, sauf qu'elle affecte tous les boutons de la barre de navigation.
Je ne suggère pas cela comme une solution générale au problème, car cela affecte tous les boutons de la barre de navigation. Il renverse le paradigme afin que vous choisissiez quand afficher les titres des boutons, plutôt que quand masquer les titres.
Pour choisir quand afficher les titres, restaurez manuellement les attributs de texte de titre si nécessaire, ou créez une sous-classe spécialisée de UIBarButtonItem
qui fait de même (potentiellement avec un autre UIAppearance
proxy).
Si vous avez une application dans laquelle la plupart des titres des boutons de retour doivent être masqués et que seuls quelques-uns (ou aucun) des boutons de navigation sont des boutons système avec des titres, cela pourrait être pour vous!
(Remarque: le changement de taille de police est nécessaire même si la couleur du texte est claire afin de garantir que les titres longs ne provoquent pas le décalage du titre de la barre de navigation centrale)
Ajoutez le code suivant dans viewDidLoad ou loadView
self.navigationController.navigationBar.topItem.title = @"";
Je l'ai testé sur iPhone et iPad avec iOS 9
Vous pouvez ajouter cette catégorie Objective-C pour que tous les boutons "Retour" créés par un contrôleur de navigation n'aient pas de texte. Je viens de l'ajouter à mon fichier AppDelegate.m.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
PS - (je ne sais pas comment faire fonctionner cette extension avec Swift, il y avait des erreurs étranges. Modifications bienvenues pour ajouter une version Swift)
override
rapidement. Question très intéressante
J'ai essayé certains ci-dessus et ci-dessous mais ils n'ont pas fonctionné. Cela a fonctionné pour moi:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
La seule chose qui fonctionne sans effets secondaires est de créer un bouton de retour personnalisé. Tant que vous ne fournissez pas d'action personnalisée, même le geste de diapositive fonctionne.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Malheureusement, si vous voulez que tous les boutons de retour dans le pour n'avoir aucun titre, vous devez configurer ce bouton de retour personnalisé dans tous vos contrôleurs de vue: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Il est très important que vous définissiez un espace comme titre et non une chaîne vide.
pour supprimer le texte du bouton arrière par programme, utilisé sous Code, cela fonctionnera à partir de xcode7 et au-dessus.
self.navigationController.navigationBar.topItem.title = @ "";
ou
manualLy dans les storyboards, sélectionnez la barre de navigation sur le contrôleur de vue et mettez "" dans le texte du bouton précédent.
cela fonctionnera. Merci
self.navigationController?.navigationBar.topItem?.title = " "
dans Xcode 9 et j'ai travaillé!
La réponse actuelle ne fonctionnait pas. Je voulais supprimer complètement le titre , mais le texte "retour" ne disparaissait pas.
Revenez au contrôleur de vue précédent et définissez sa propriété title:
self.title = @" ";
Fonctionne UNIQUEMENT lorsque le contrôleur de vue précédent n'a pas de titre
@""
.
Méthode alternative - utilisez la classe NavigationBar personnalisée.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
Autrement dit, cela supprime tout le projet des titres. Définissez simplement une classe personnalisée pour UINavigationController.
Définissez le titre du VC précédent sur une chaîne "" avec un espace. et le titre avec le bouton de retour sera remplacé par une seule chaîne d'espace.
Self.title = " "
Sur Retour, appuyez à nouveau pour réinitialiser le titre à celui d'origine dans la vue.
Utilisez une personnalisation NavigationController
qui remplacepushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
Beaucoup de réponses déjà, voici mes deux cents sur le sujet. J'ai trouvé cette approche vraiment robuste. Il vous suffit de le mettre dans viewController avant de segue.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
J'ai tout essayé dans ce post. La seule solution de travail est @ VoidLess
Voici la même réponse mais plus complète
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
C'est ma résolution pour iOS11, je change l'apparence de UIBarButtonItem dans applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Vous ne pouvez pas modifier le décalage Y, car cela modifiera également la position du bouton de la barre arrière dans iOS11, mais c'est OK dans iOS10 et les versions antérieures.
Dans Swift3,
Si vous définissez le paramètre global
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Swift 3.1 Vous pouvez le faire en implémentant la méthode déléguée de UINavigationController.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Pour ceux qui souhaitent masquer globalement le titre du bouton précédent.
Vous pouvez SWIZZLE viewDidLoad
de UIViewController
ce genre.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
Usage:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Si vous ciblez iOS 13 et versions ultérieures, vous pouvez utiliser cette nouvelle API pour masquer globalement le titre du bouton Précédent .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
J'avais du mal avec cela parce que j'avais un contrôleur de navigation personnalisé. J'ai pu supprimer le texte de l'élément arrière dans tous les contrôleurs de vue avec ce code dans ma classe de contrôleur de navigation personnalisé
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Cela supprime tous les titres des éléments arrière à l'aide de ce contrôleur de navigation personnalisé.
Dans iOS 11, nous avons constaté que la définition de UIBarButtonItem
la police / couleur du texte d'apparence sur une très petite valeur ou une couleur claire entraînerait la disparition d'un autre élément de la barre (le système n'honore plus la classe de l'élément UIBarButton, il le convertira en_UIModernBarButton
). Le réglage du décalage du texte arrière sur hors écran entraînera un flash pendant le pop interactif.
Alors nous avons balancé addSubView
:
+ (void)load {
if (@available(iOS 11, *)) {
[NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
}
}
- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
view.alpha = 0;
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (id)view;
[button setTitle:@" " forState:UIControlStateNormal];
}
[self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}
Le texte arrière provient du dernier View du contrôleur de vue navigationItem.title
et navigationItem.title
est automatiquement défini par self.title
. Un moyen si simple de résoudre le problème est le crochet setTitle:
, assurez-vousnavigationItem.title = @""
Mettez ce code à AppDelegate.m
ça va faire ça。
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
Plus de détails sur https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
Ma solution: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Une manière très simple - bien que peut-être un peu hacky - de faire cela par programme si vous n'avez pas besoin du bouton de retour personnalisé est de définir la taille de la police égale à zéro dans le contrôleur de vue que vous poussez sur la pile, en appelant quelque chose comme ça depuis viewDidLoad
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
Enfin trouvé la solution parfaite pour masquer le texte de retour par défaut dans toute l'application.
Ajoutez simplement une image transparente et ajoutez le code suivant dans votre AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
La méthode suivante fonctionne sur iOS 11 et est sûre de ne pas planter sur les autres versions iOS. Cela pourrait entraîner le rejet de votre application dans l'examen de l'App Store, car UIModernBarButton et UIBackButtonContainerView sont des API privées. Placez dans AppDelegate.
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Version Swift, fonctionne parfaitement globalement:
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
}
solution
. Comme @limfinity l'a souligné, cela le changera universellement pour tous les UIBarButtonItem de l'application