7

Sto cercando di personalizzare l'backBarButtonItem un'immagine personalizzata (il testo 'back' è incluso in questa immagine) con, ecco il risultato corrente:Personalizzazione del BackBarButtonItem

http://i.imgur.com/rFxFt.png

Qualcuno sa perché questo potrebbe accadere?

Ecco il mio codice su viewDidLoad (in realtà funziona sia sul controller principale e poi di nuovo sul nuovo controller che ha il tasto back)

UIImage *backButtonImage = [UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"]; 


UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
           initWithImage:backButtonImage 
           style:UIBarButtonItemStylePlain 
           target:nil 
           action:nil]; 


self.navigationItem.backBarButtonItem = backButton; 

Edit: sto usando iOS 5 tra l'altro! Forse il proxy di apparenza è utilizzabile, ma finora quando ho provato ad usarlo per il back button (in appDelegate) l'app si blocca in modo semplice.

+0

assicuratevi di approvare la risposta appropriata! –

risposta

16

Ok ho risolto il problema, utilizzando un po 'di un trucco di massima, ma almeno funziona. Se qualcuno ha trovato una soluzione più standard, per favore fatemelo sapere!

Ecco il mio codice:

UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; 

Questo è nel metodo di mia AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

per fermarlo si estende quando lo si utilizza come sfondo, ho usato l'idea da iOS 5: How to implement a custom (image) back button

Ma poi l'ha modificato così piuttosto che dover impostare-

self.title = @" "; 

Su ogni carico vista (e che potrebbe anche pasticciare con il titolo barra di navigazione stesso)

Ho appena impostare l'offset per il testo 'back' pulsante per due volte l'altezza dell'immagine, in modo da non vedrai mai esso.

Perché andare a tutto questo problema, piuttosto che utilizzare una voce pulsante sinistro con il proprio metodo per far apparire il controller di visualizzazione?

Il motivo principale è che si perde l'animazione di scorrimento del pulsante Indietro standard per la modifica delle visualizzazioni. Inoltre, questo significa che non ho bisogno di usare un pulsante personalizzato o scrivere un metodo personalizzato per tornare indietro. Semplicemente funziona.

Spero che questo risolva anche il problema di qualcun altro, so che sono rimasto bloccato per ben 3 ore!

+0

per verificare la mia risposta che eviti il ​​problema di allungamento dell'immagine e di posizione del titolo. – Gon

0

La designazione "UIBarButtonItemStylePlain" specifica uno stile di pulsante.

Prova a creare il tuo pulsante indietro in questo modo invece:

UIImage *backButtonImage = [UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"]; 
CGRect frameimg = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height); 
UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
[someButton setBackgroundImage:backButtonImage forState:UIControlStateNormal]; 
// you have to do your own backButtonAction to pop the view controller, b.t.w. 
[someButton addTarget:self action:@selector(backButtonAction:) 
    forControlEvents:UIControlEventTouchUpInside]; 
[someButton setShowsTouchWhenHighlighted:YES]; 

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
[someButton release]; 

self.navigationItem.backBarButtonItem = backButton; 
+0

Grazie per il tentativo di Michael, ma quando uso il tuo codice il pulsante indietro semplicemente ripristina completamente il normale stile blu senza personalizzazione. (Penso di aver già provato molte varianti simili a questo metodo) Ho notato dalla riga di codice "di rilascio" che dovrei indicare che sto usando iOS 5! Quindi questo probabilmente cambia molto, errore mio non averlo chiarito in origine. –

+4

Stato documenti Apple: ** Quando si configura l'elemento del pulsante della barra, non assegnare ad esso una vista personalizzata; l'elemento di navigazione ignora comunque le visualizzazioni personalizzate nel pulsante della barra posteriore. ** –

+1

@AshleyMills ha perfettamente ragione. Questa risposta funziona solo per 'leftBarButtonItem' e' rightBarButtonItem', non per 'backBarButtonItem'. – Gon

0

In questo caso ho trovato più facile sostituire il barButtonItem, semplicemente con un pulsante personalizzato.

Non esattamente sicuro di come hai progettato il tuo progetto, ma ha funzionato per me.

The setting for the custom button

The back button, resulting look

quindi collegare il codice a esso:

//go back to the previous screen 

-(IBAction)back{ 

[self dismissModalViewControllerAnimated:YES]; 

} 
+1

Va bene, ma poi perdo l'animazione di scorrimento standard quando apro il controller della vista. Accade anche che per questo progetto non utilizzi affatto il builder dell'interfaccia o i file nib/xib. Sto programmaticamente creando tutto. –

+0

Non proprio preoccupando la sua domanda. Perdi la possibilità di utilizzare e utilizzare la UINavigationBar standard –

0

Oggi ho provato molto e ho trovato questa soluzione. Si è separato immagine di sfondo e pulsante immagine, sembra più facile e non così difficile.

UIImage *bgImage = [UIImage imageNamed:@"the-same-image-as-your-navbar-background-image"]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:bgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:bgImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 

UIImage *buttonImage = [UIImage imageNamed:@"your-back-button-image"]; 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:buttonImage style:UIBarButtonItemStylePlain target:nil action:nil]; 
self.navigationItem.backBarButtonItem = backButton;