Spostare l'immagine UITabBarItem verso il basso?


98

Normalmente su ogni scheda di un UITabBarhai una piccola immagine e un titolo che nomina la scheda. L'immagine è posizionata / centrata verso la parte superiore della scheda per accogliere il titolo sottostante. La mia domanda è: se vuoi avere una tabBar con solo un'immagine e nessun titolo, c'è un modo per spostare l'immagine verso il basso in modo che si centra meglio all'interno della scheda?

Attualmente sto utilizzando (vedi sotto):

[tabBarItem setFinishedSelectedImage:tabSelected withFinishedUnselectedImage:tabUnselected];

ma preferirei utilizzare un'immagine più grande senza titolo, al momento se ingrandisco l'immagine di circa 70 pixel @ 2x inizia a sfiorare la parte superiore UITabBarlasciando molto spazio inutilizzato nella parte inferiore.

Risposte:


179

Prova a regolare tabBarItem's imageInsets(per spostare l'immagine dell'icona) e impostare il titolo del controller su zero (in modo che non venga visualizzato alcun titolo). Metti qualcosa di simile a -inito -viewDidLoadmetodo nel controller di visualizzazione:

Obiettivo-C

self.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0);
self.title = nil;

Swift

self.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
self.title = nil

UITabBarItemè una sottoclasse di UIBarItemcui ha UIEdgeInsets imageInsetsproprietà. Gioca un po 'con gli inserti finché non sembra buono (a seconda delle immagini dell'icona della barra delle schede)


3
@ Luka: ma questo riduce le immagini.
Sourabh Bhardwaj

1
@Sourabh non li rimpicciolisce per me
TigerCoding

7
Il valore di inserimento effettivo è 5,5 f se è necessario che sia pixel perfetto.
utente

1
@ rr1g0 Non è possibile spostare il badge nella posizione personalizzata. Se hai bisogno della posizione personalizzata di un badge o dell'aspetto di un badge personalizzato, devi implementarlo tu stesso
Lukas Kukacka

1
@Sourabh devi compensare il fondo con un valore negativo per non rimpicciolire l'immagine.
Rmalmoe

150

Puoi farlo anche tramite storyboard. Seleziona il tuo tabbaritem, vai all'ispettore delle dimensioni e assegna gli inserti appropriati.

inserisci qui la descrizione dell'immagine

* Dimostrato su Xcode, versione 7.3.1 (7D1014)


bello e pulito!
ken

La migliore di tutte le risposte ... Grazie mille @Neil Galiaskarov
Venkatesh Chejarla

49

Crea una sottoclasse di UITabBarControllere nella sua viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.viewControllers enumerateObjectsUsingBlock:^(UIViewController *vc, NSUInteger idx, BOOL *stop) {
        vc.tabBarItem.title = nil;
        vc.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    }];
}

Swift 3:

for vc in self.viewControllers! {
    vc.tabBarItem.title = nil
    vc.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0)
}

questo ha funzionato per me. solo che per swift il metodo enumerateObjectsUsingBlock non è più disponibile
Junchao Gu

non sottoclasse, inseriscilo invece nel tuo AppDelegate
Laszlo

1
anche l'inserimento di questo frammento AppDelegatefunziona, ma ovviamente non è meglio che sottoclassarlo. Puoi avere la tua preferenza però :)
Brian

10

Se stai usando Xamarin, funziona:

screen.TabBarItem.ImageInsets = new UIEdgeInsets(5, 0, -5, 0);
screen.TabBarItem.Title = "";

10

Questo ha funzionato per me

Swift 4

let array = tabBarController?.customizableViewControllers
for controller in array! {
    controller.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0)
}

2

SWIFT 3.0

È possibile impostare gli insiemi di immagini, impostare in alto, a sinistra, in basso e a destra in base al design.

self.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0)

2

Per iOS 11 è necessario sovrascrivere il metodo TraitCollection oltre all'impostazione di ImageInsets. Aggiungi il metodo nella tua classe UITabBarController sottoclasse

public override UITraitCollection TraitCollection {
 get {
  return UITraitCollection.FromHorizontalSizeClass(horizontalSizeClass: UIUserInterfaceSizeClass.Compact);
 }
}

Un buon consiglio che mi ha aiutato a risolvere un problema relativo alla posizione dell'immagine per l'elemento della barra delle schede su iPad e iOS 11. Ma è troppo difficile sovrascrivere la raccolta di tratti a livello di controller della vista, è meglio sottoclassare la classe UITabBar e sovrascrivere la proprietà traitCollection Là. Anche la restituzione di una raccolta di tratti con solo la classe orizzontale, eliminerà le altre proprietà della raccolta di tratti. return UITraitCollection(traitsFrom: [ super.traitCollection, UITraitCollection(horizontalSizeClass: .compact)])ha fatto il trucco per me.
Emmanuel Paris

1

In Swift 4.2 , UIEdgeInsetsMakeè deprecato, invece dovremmo usare UIEdgeInsets,

let array = tabBarController?.customizableViewControllers
    for controller in array! {
        controller.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0)
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.