Come posso nascondere il testo del pulsante Indietro da un controller di navigazione UIN? Avrò solo "<" e non "<Indietro"
Come posso nascondere il testo del pulsante Indietro da un controller di navigazione UIN? Avrò solo "<" e non "<Indietro"
Risposte:
Nel generatore di interfacce , puoi selezionare l'elemento di navigazione del controller precedente e modificare la Back Button
stringa come desideri che appaia il pulsante Indietro. Se lo vuoi vuoto, ad esempio, metti uno spazio.
Puoi anche modificarlo con questa riga di codice:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
O in Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
è già vuoto in IB, aggiungi uno spazio per ottenere il passaggio Back
e mostra solo la freccia.
Puoi anche farlo attraverso lo storyboard. Nell'ispettore degli attributi dell'elemento di navigazione del controller precedente era possibile impostare "" nel campo del pulsante Indietro. Fare riferimento all'immagine di seguito. Sostituisci "Il tuo titolo qui" con "". In questo modo otterrai il risultato desiderato. Non hai più bisogno di scherzare con il "Titolo".
A livello di codice potresti usare
[self.navigationItem.backBarButtonItem setTitle:@" "];
dove self si riferisce al controller che spinge il controller di visualizzazione desiderato.
Esempio prima, dopo la barra di navigazione
Prima
Dopo
backBarButtonItem
codice non funziona, ma l'impostazione tramite lo storyboard sì.
backBarButtonItem
programmazione funziona per me in iOS 9.
Puoi implementare in UINavigationControllerDelegate
questo modo:
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
è l' nil
impostazione predefinita e influisce sul controller successivo, quindi è sufficiente impostarlo per tutti i controller
L'impostazione del titolo del pulsante Indietro su @""
o nil
non funzionerà. È necessario impostare l'intero pulsante vuoto (senza titolo o immagine):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Questo dovrebbe essere fatto sul controller della vista che si trova in cima al controller della vista nello stack di navigazione (cioè da dove navighi al tuo VC tramite il pushViewController
metodo)
Un'altra soluzione a questo problema per le situazioni in cui si dispone di una grande quantità di controller di visualizzazione è utilizzare un UIAppearance
proxy per nascondere efficacemente il testo del titolo del pulsante Indietro in questo modo:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Questa soluzione renderà il testo come un piccolo punto chiaro, simile all'impostazione manuale del titolo del pulsante Indietro @" "
, tranne per il fatto che influisce su tutti i pulsanti della barra di navigazione.
Non lo suggerisco come soluzione generale al problema perché influisce su tutti i pulsanti della barra di navigazione. Capovolge il paradigma in modo che tu scelga quando mostrare i titoli dei pulsanti, piuttosto che quando nasconderli .
Per scegliere quando mostrare i titoli, ripristinare manualmente gli attributi del testo del titolo secondo necessità o creare una sottoclasse specializzata UIBarButtonItem
che faccia lo stesso (potenzialmente con un altro UIAppearance
proxy).
Se hai un'app in cui la maggior parte dei titoli dei pulsanti Indietro deve essere nascosta e solo pochi (o nessuno) dei pulsanti di navigazione sono pulsanti di sistema con titoli, questo potrebbe essere per te!
(Nota: la modifica della dimensione del carattere è necessaria anche se il colore del testo è chiaro per garantire che i titoli lunghi non causino lo spostamento del titolo della barra di navigazione centrale)
Aggiungi il codice seguente in viewDidLoad o loadView
self.navigationController.navigationBar.topItem.title = @"";
L'ho provato su iPhone e iPad con iOS 9
Puoi aggiungere questa categoria Objective-C per fare in modo che tutti i pulsanti "Indietro" creati da un controller di navigazione non abbiano testo. L'ho appena aggiunto al mio file 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 - (non so come far funzionare questa estensione con Swift, presentava strani errori. Le modifiche sono benvenute per aggiungere una versione Swift)
override
farlo in fretta. Domanda molto interessante
Ho provato alcuni sopra e sotto ma non hanno funzionato. Questo ha funzionato per me:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
L'unica cosa che funziona senza effetti collaterali è creare un pulsante Indietro personalizzato. Finché non fornisci un'azione personalizzata, anche il gesto di scorrimento funziona.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Sfortunatamente, se vuoi che tutti i pulsanti Indietro in non abbiano alcun titolo, devi impostare questo pulsante Indietro personalizzato in tutti i tuoi controller di visualizzazione: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
È molto importante impostare uno spazio bianco come titolo e non una stringa vuota.
per rimuovere il testo dal pulsante Indietro in modo programmatico, usato sotto il codice funzionerà da xcode7 e sopra.
self.navigationController.navigationBar.topItem.title = @ "";
o
manualNegli storyboard, seleziona la barra di navigazione sul controller della vista e inserisci "" nel testo del pulsante Indietro.
questo funzionerà. Grazie
self.navigationController?.navigationBar.topItem?.title = " "
in Xcode 9 e ho funzionato!
La risposta attuale non funzionava. Volevo rimuovere completamente il titolo , ma il testo "indietro" non sarebbe scomparso.
Torna al controller di visualizzazione precedente e imposta la sua proprietà del titolo:
self.title = @" ";
Funziona SOLO quando il controller di visualizzazione precedente non ha un titolo
@""
.
Modo alternativo: usa la classe NavigationBar personalizzata.
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()
}
}
Cioè, questo rimuove i titoli di coda dell'intero progetto. Basta impostare la classe personalizzata per UINavigationController.
Impostare il titolo del VC precedente su "" stringa con spazio. e il titolo con il pulsante Indietro verrà sostituito con una singola stringa di spazio.
Self.title = " "
Su Indietro premere di nuovo per ripristinare il titolo a quello originale nella viewWillAppear.
Usa un costume NavigationController
che prevalepushViewController
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)
}
}
Molte risposte già, ecco i miei due centesimi sull'argomento. Ho trovato questo approccio davvero robusto. Devi solo metterlo in viewController prima di segue.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Ho provato di tutto in questo post. L'unica soluzione funzionante è @ VoidLess's
Ecco la stessa risposta ma più completa
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)
}
}
Questa è la mia risoluzione per iOS11, cambio l'aspetto di UIBarButtonItem in applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Non è possibile modificare l'offset Y, perché cambierà anche la posizione del pulsante della barra posteriore in iOS11, ma va bene in iOS10 e versioni precedenti.
In Swift3,
Se imposti l'impostazione globale
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 Puoi farlo implementando il metodo delegato di 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
}
Per coloro che vogliono nascondere il titolo del pulsante Indietro a livello globale.
È possibile swizzle viewDidLoad
di UIViewController
come questo.
+ (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);
}
}
Utilizzo:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Se stai prendendo di mira iOS 13 e versioni successive, puoi utilizzare questa nuova API per nascondere il titolo del pulsante Indietro a livello globale .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Stavo lottando con questo perché avevo un controller di navigazione personalizzato. Sono stato in grado di rimuovere il testo dell'elemento posteriore in tutti i controller di visualizzazione con questo codice nella mia classe controller di navigazione personalizzata
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Ciò rimuove tutti i titoli degli elementi precedenti utilizzando questo controller di navigazione personalizzato.
In iOS 11, abbiamo riscontrato che l'impostazione UIBarButtonItem
del carattere / colore del testo dell'aspetto su un valore molto piccolo o un colore chiaro comporterà la scomparsa di altri elementi della barra (il sistema non rispetta più la classe dell'elemento UIBarButton, lo convertirà in a _UIModernBarButton
). Inoltre, impostando l'offset del testo a ritroso su offscreen il risultato lampeggerà durante la visualizzazione interattiva.
Quindi abbiamo cambiato 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];
}
Il testo posteriore proviene dall'ultimo controller di visualizzazione navigationItem.title
, ed navigationItem.title
è impostato automaticamente da self.title
. Il modo più semplice per risolvere il problema è il gancio setTitle:
, assicuratinavigationItem.title = @""
Metti questo codice a AppDelegate.m
volontà lo farà ok。
[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];
Maggiori dettagli su https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
La mia soluzione: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Un modo molto semplice, anche se forse un po 'hacky, di farlo a livello di codice se non hai bisogno del pulsante Indietro personalizzato è impostare la dimensione del carattere uguale a zero nel controller della vista che stai inserendo nello stack, chiamando qualcosa di simile da 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
}
Finalmente ho trovato la soluzione perfetta per nascondere il testo predefinito in tutta l'app.
Basta aggiungere un'immagine trasparente e aggiungere il seguente codice nel tuo AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Il seguente metodo funziona su iOS 11 ed è sicuro che non si blocca su altre versioni di iOS. In questo modo la tua app potrebbe essere rifiutata nella revisione dell'App Store poiché sia UIModernBarButton che UIBackButtonContainerView sono API private. Posiziona in 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)
}
Versione Swift, funziona perfettamente a livello globale:
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
. Come indicato da @limfinity, lo cambierà universalmente per tutti gli UIBarButtonItem in tutta l'app