2016-05-31 45 views
18

Ho bisogno di personalizzare l'aspetto di un pulsante Indietro in un progetto Swift.Swift personalizzato Pulsante Indietro Immagine e testo del NavBar

Ecco quello che ho: Default Back Button

Ecco quello che voglio: Custom Back Button

ho provato creare il mio UIBarButtonItem ma non riesco a capire come ottenere l'immagine da accanto al testo, piuttosto che come sfondo o come sostituto del testo.

let backButton = UIBarButtonItem(title: "Custom", style: .Plain, target: self, action: nil ) 
//backButton.image = UIImage(named: "imageName") //Replaces title 
backButton.setBackgroundImage(UIImage(named: "imageName"), forState: .Normal, barMetrics: .Default) // Stretches image 
navigationItem.setLeftBarButtonItem(backButton, animated: false) 
+0

@Randy Vuoi dire fare un UIView e aggiungere un'etichetta e ImageView e impostare questo? – Conor

risposta

31

si può fare qualcosa di simile:

let yourBackImage = UIImage(named: "back_button_image") 
self.navigationController?.navigationBar.backIndicatorImage = yourBackImage 
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage 
self.navigationController?.navigationBar.backItem?.title = "Custom" 

La tua immagine avrà un colore unico se

+1

Principalmente funzionante, il titolo del pulsante non è cambiato. lasciare yourBackImage = UIImage (denominato: "back_button_image") self.navigationController .navigationBar.backIndicatorImage = yourBackImage self.navigationController .navigationBar.backIndicatorTransitionMaskImage = yourBackImage self.navigationController .navigationBar.backItem .title = "???? Personalizzato " – Conor

+0

Il pulsante Indietro è posizionato al centro dello schermo? qualche idea? –

4

Per l'immagine pulsante indietro:

  • Con questo tutorial: (ma non ha funzionato per me)

    UINavigationBar.appearance().backIndicatorImage = UIImage(named: "imageName") 
    
  • Ma questo stack answer: (lavorato per me)

    let backButtonImage = UIImage(named: "back-button-image") 
    backButtonImage = backButtonImage?.stretchableImageWithLeftCapWidth(15, topCapHeight: 30) 
    UIBarButtonItem.appearance().setBackButtonBackgroundImage(backButtonImage, forState: .Normal, barMetrics: .Default) 
    

E per il tipo di carattere, assumendo che desidera che il tipo di carattere per abbinare per l'intera barra di navigazione: (attualmente in uso)

if let font = UIFont(name: "Avenir-Book", size: 22) { 
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: font] 
} 
17

Nota: si ricorda che il pulsante indietro b si adatta al ViewController di origine e non al ViewController di destinazione. Pertanto, la modifica deve essere fatto nella sorgente VC, che si riflette a tutti la vista nel controller di navigazione

Frammento di codice:

let backImage = UIImage(named: "icon-back") 

self.navigationController?.navigationBar.backIndicatorImage = backImage 

self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backImage 

/*** If needed Assign Title Here ***/ 
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) 
+0

funziona, MA, come impostare la cornice dell'immagine. Solo con questo codice l'intera immagine va fuori cornice. – Annjawn

+0

@L'immagine di Annjawn può essere corretta in questo modo: UIImage (denominato: "icona-indietro") ?. stretchableImage (withLeftCapWidth: 15, topCapHeight: 30), come mostrato nella risposta di Idan sotto – Vitalii

2

rapida 3

extension UIViewController { 

     func setBackButton(){ 
      let yourBackImage = UIImage(named: "backbutton") 
      navigationController?.navigationBar.backIndicatorImage = yourBackImage 
      navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage 
     } 

    } 
1

rapida 4

Nel mio caso, avevo bisogno di avere solo l'immagine del pulsante, senza testo. Spero che questo possa essere utile a qualcuno.

let imgBackArrow = UIImage(named: "back_arrow_32") 

navigationController?.navigationBar.backIndicatorImage = imgBackArrow 
navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBackArrow 

navigationItem.leftItemsSupplementBackButton = true 
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil) 
1

Avere un pulsante nella barra di navigazione con Immagine e testo è piuttosto difficile. Soprattutto dopo aver introdotto un nuovo mal di testa con UIBarButtonItem posizione in iOS 11: iOS 11 - UIBarButtonItem horizontal position

È possibile effettuare uno dei due pulsanti con l'immagine o un pulsante con il testo, ma non un pulsante con entrambi. Ho anche provato due UIBarButtonItem insieme, uno con l'immagine e l'altro con il testo - non ha ancora un bell'aspetto e il loro UIStackView non può essere facilmente accessibile per la modifica.

inaspettatamente ho trovato una soluzione semplice semplice:

1) progettare il tasto come vista in Interface Builder. Nel mio caso è all'interno di target UIViewController e accessibile tramite IBOutlet per semplicità

2) imposta il vincolo Spazio iniziale per l'immagine come negativo, potresti anche voler impostare il colore di sfondo della vista su. Chiaro.

enter image description here

3) lo usano:

@IBOutlet var backButtonView: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let backButton = UIBarButtonItem(customView: self.backButtonView) 
    self.backButtonView.heightAnchor.constraint(equalToConstant: 45).isActive = true 
    self.backButtonView.widthAnchor.constraint(equalToConstant: 75).isActive = true 
    self.navigationItem.leftBarButtonItem = backButton 
} 

Questo è tutto. Non è necessario utilizzare il trucco con spacer negativo per iOS 10 o il trucco con imageInsets per iOS 11 (che funziona solo se si dispone di un'immagine e non funziona per immagine + testo, BTW).

enter image description here