2014-10-21 9 views
61

Domanda semplice, come posso rimuovere il testo dell'elemento della barra delle schede e mostrare solo l'immagine?Rimuovi il testo dell'elemento della barra delle schede, mostra solo l'immagine

Voglio gli elementi a barre per piace in app Instagram:

enter image description here

Nella finestra di ispezione in Xcode 6 rimuovo il titolo e scegliere un @ 2x (50px) e una @ 3x (75px) Immagine. Tuttavia l'immagine non utilizza lo spazio libero del testo rimosso. Qualche idea su come ottenere la stessa immagine di una barra delle immagini come nell'app instagram?

+3

duplicati con: http://stackoverflow.com/questions/11811831/only-image-as-uitabbaritem/30083794 # 30083794 – algal

+1

utilizzando '" "' per il titolo, forse? – holex

risposta

97

Si dovrebbe giocare con imageInsets proprietà di UITabBarItem. Ecco il codice di esempio:

let tabBarItem = UITabBarItem(title: nil, image: UIImage(named: "more") 
tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) 

valori all'interno UIEdgeInsets dipendono dalla dimensione dell'immagine. Ecco il risultato di tale codice nella mia app:

enter image description here

+21

È anche possibile regolare i margini dell'immagine nell'ispettore. –

+0

@artworkad シ GRAZIE MOLTO! Sono stato alla ricerca di questo per così tanto tempo. –

+0

I numeri magici sono una cattiva idea. Si prega di vedere la mia risposta per un modo universalmente compatibile per realizzare la stessa cosa. –

10

ho usato il seguente codice nel viewDidLoad di mio BaseTabBarController. Nota che nel mio esempio ho 5 schede e l'immagine selezionata sarà sempre base_immagine + "_selezionato".

// Get tab bar and set base styles 
let tabBar = self.tabBar; 
tabBar.backgroundColor = UIColor.whiteColor() 

// Without this, images can extend off top of tab bar 
tabBar.clipsToBounds = true 

// For each tab item.. 
let tabBarItems = tabBar.items?.count ?? 0 
for i in 0 ..< tabBarItems { 
    let tabBarItem = tabBar.items?[i] as UITabBarItem 

    // Adjust tab images (Like mstysf says, these values will vary) 
    tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -6, 0); 

    // Let's find and set the icon's default and selected states 
    // (use your own image names here) 
    var imageName = "" 
    switch (i) { 
    case 0: imageName = "tab_item_feature_1" 
    case 1: imageName = "tab_item_feature_2" 
    case 2: imageName = "tab_item_feature_3" 
    case 3: imageName = "tab_item_feature_4" 
    case 4: imageName = "tab_item_feature_5" 
    default: break 
    } 
    tabBarItem.image = UIImage(named:imageName)!.imageWithRenderingMode(.AlwaysOriginal) 
    tabBarItem.selectedImage = UIImage(named:imageName + "_selected")!.imageWithRenderingMode(.AlwaysOriginal) 
} 
+1

Invece di usare 'per var i = 0; io

64
// Remove the titles and adjust the inset to account for missing title 
for(UITabBarItem * tabBarItem in self.tabBar.items){ 
    tabBarItem.title = @""; 
    tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
} 
+2

Questa dovrebbe essere la risposta accettata! Grazie! –

+1

Invece di rimuovere il titolo, cambiare il colore del testo per cancellare. Il titolo può essere utile. –

+1

Kodos to Eduardo! Mi ha fatto capire che una buona opzione è anche quella di impostare un UIOffset verticale sul titolo dell'oggettoPositionAjustement –

16

versione Swift di ddiego risposta

chiamare questa funzione in viewDidLoad di ogni primo figlio dei viewControllers dopo aver impostato il titolo del viewController

func removeTabbarItemsText() { 
    if let items = tabBar.items { 
     for item in items { 
      item.title = "" 
      item.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
     } 
    } 
} 
+1

Grande funzionalità! In alternativa puoi creare una sottoclasse di questo 'class BaseTabBarController: UITabBarController, UITabBarControllerDelegate' e inserisci questa funzione nel' viewDidLoad' della sottoclasse – daspianist

17

Se sei usando gli storyboard questa sarebbe la migliore opzione. Fa scorrere tutti gli elementi della barra delle schede e per ognuno imposta il titolo su nulla e rende l'immagine a schermo intero. (È necessario aver aggiunto un'immagine nello storyboard)

for tabBarItem in tabBar.items! 
{ 
    tabBarItem.title = "" 
    tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0) 
} 
+0

Bene notare che se non si impostano entrambi gli insiemi superiore e inferiore l'immagine finirà per essere deformata . –

12

Utilizzando l'approccio con l'impostazione ogni UITabBarItem s proprietà title a "" e aggiornare imageInsets non funziona correttamente se nel controller di vista self.title è impostato. Ad esempio se self.viewControllers di UITabBarController sono incorporati in UINavigationController e il titolo deve essere visualizzato sulla barra di navigazione. In questo caso impostare il titolo UINavigationItem direttamente utilizzando self.navigationItem.title, non self.title.

+0

Questo dovrebbe essere contrassegnato come una risposta. – Oleg

+0

Questo sembra un metodo più pulito. +1 @Oleg questo dovrebbe essere contrassegnato come risposta. – akseli

2

Ecco un modo più infallibile migliore per fare questo diverso la risposta in alto:

[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} 
             forState:UIControlStateNormal]; 
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} 
             forState:UIControlStateHighlighted]; 

mettere questo nel vostro AppDelegate.didFinishLaunchingWithOptions in modo che colpisce tutti i pulsanti della barra delle schede per tutta la durata della vostra applicazione.

+2

Nasconde solo il titolo e non regola la posizione dell'immagine. – mustafa

+0

Sì, ma la domanda non diceva nulla sulla regolazione dell'immagine. Nascondendo il testo. E nascondere il testo a scapito della rimozione del titolo da un controller di visualizzazione sembra sbagliato. Soprattutto quando potevi usare quel titolo per mostrarlo come parte del tuo navigationviewcontroller – Dan1one

50

Ecco come lo si fa in uno storyboard.

Cancellare il testo del titolo, e impostare l'inserto di immagini come la schermata qui sotto

enter image description here

Ricordate la dimensione delle icone dovrebbe seguire la apple design guideline

enter image description here

Questo significa che si dovrebbe avere 25px x 25px per @ 1x, 50px x 50px per @ 2x, 75px x 75px per @ 3x

3

Un minimo, cassetta di sicurezza estensione UITabBarController in Swift (sulla base di @ korgx9 risposta):

extension UITabBarController { 
    func removeTabbarItemsText() { 
    tabBar.items?.forEach { 
     $0.title = "" 
     $0.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0) 
    } 
    } 
} 
10

iOS 11 getta un capriccio in molte di queste soluzioni, quindi ho solo fissato i miei problemi su iOS 11 per sottoclassi UITabBar e Sovrapposizione layout di visualizzazioni.

class MainTabBar: UITabBar { 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     // iOS 11: puts the titles to the right of image for horizontal size class regular. Only want offset when compact. 
     // iOS 9 & 10: always puts titles under the image. Always want offset. 
     var verticalOffset: CGFloat = 6.0 

     if #available(iOS 11.0, *), traitCollection.horizontalSizeClass == .regular { 
      verticalOffset = 0.0 
     } 

     let imageInset = UIEdgeInsets(
      top: verticalOffset, 
      left: 0.0, 
      bottom: -verticalOffset, 
      right: 0.0 
     ) 

     for tabBarItem in items ?? [] { 
      tabBarItem.title = "" 
      tabBarItem.imageInsets = imageInset 
     } 
    } 
} 
+0

questa è l'unica cosa che ha funzionato per me, ma ho dovuto inserire il codice all'interno di "override func viewDidLayoutSubviews" della sottoclasse di MyTabBarController. Ho sottoclassato TabBarController e l'ho chiamato così –

5

Swift 4 approccio

ho potuto fare il trucco implementando una funzione che prende un TabBarItem e fa parte della formattazione ad esso.

Sposta l'immagine leggermente verso il basso per renderla più centrata e nasconde anche il testo della barra delle schede. funzionato meglio che solo impostando il suo titolo ad una stringa vuota, perché quando si ha un NavigationBar pure, il TabBar riacquista il titolo del viewController quando selezionato

func formatTabBarItem(tabBarItem: UITabBarItem){ 
    tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0) 
    tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear], for: .selected) 
    tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear], for: .normal) 
} 
+1

esattamente quello che stavo cercando! Grazie mille Jose !!!! –

Problemi correlati