Przenosisz obraz UITabBarItem w dół?

98

Zwykle na każdej karcie znajduje UITabBarsię mały obraz i tytuł z nazwą karty. Obraz jest umieszczany / wyśrodkowany w górnej części karty, aby zmieścić tytuł pod spodem. Moje pytanie brzmi: jeśli chcesz mieć tabBar z samym obrazem i bez tytułu, czy istnieje sposób na przesunięcie obrazu w dół, aby lepiej wyśrodkował się w zakładce?

Obecnie używam (patrz poniżej):

[tabBarItem setFinishedSelectedImage:tabSelected withFinishedUnselectedImage:tabUnselected];

ale wolałby użyć większego obrazu bez tytułu, w tej chwili, jeśli zrobię obraz większy niż około 70 pikseli @ 2x, zacznie się on od góry UITabBar, pozostawiając dużo niewykorzystanego miejsca na dole.

fuzzygoat
źródło

Odpowiedzi:

179

Spróbuj wyregulować tabBarItems imageInsets(aby przesunąć obraz ikony) i ustawić tytuł kontrolera na zero (aby tytuł nie był wyświetlany). Umieść coś takiego w -initlub -viewDidLoadmetodzie w kontrolerze widoku:

Cel C

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

Szybki

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

UITabBarItemjest podklasą, UIBarItemktóra ma UIEdgeInsets imageInsetswłasność. Pobaw się trochę wstawkami, aż będzie dobrze wyglądać (w zależności od obrazów ikon na pasku kart)

Lukas Kukacka
źródło
3
@Lukas: ale to zmniejsza obrazy.
Sourabh Bhardwaj,
1
@Sourabh nie kurczy je dla mnie
TigerCoding
7
Rzeczywista wartość wstawki to 5,5f, jeśli chcesz, aby była doskonała pod względem pikseli.
użytkownik
1
@ rr1g0 Przeniesienie plakietki do pozycji niestandardowej nie jest możliwe. Jeśli potrzebujesz niestandardowej pozycji odznaki lub niestandardowego wyglądu odznaki, musisz to zaimplementować samodzielnie
Lukas Kukacka
1
@Sourabh, musisz przesunąć dno wartością ujemną, aby nie zmniejszyć obrazu.
Rmalmoe
150

Możesz to również zrobić za pomocą scenorysu. Wybierz swój tabbaritem, przejdź do inspektora rozmiaru i przypisz odpowiednie wstawki.

wprowadź opis obrazu tutaj

* Demonstrowany w Xcode, wersja 7.3.1 (7D1014)

Neil Galiaskarov
źródło
ładne i czyste!
ken
Najlepsza ze wszystkich odpowiedzi ... Dziękuję bardzo @Neil Galiaskarov
Venkatesh Chejarla
49

Utwórz podklasę UITabBarControlleri w jej 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)
}
Brian
źródło
to działało dla mnie. tylko że dla szybkiego metoda enumerateObjectsUsingBlock nie jest już dostępna
Junchao Gu
nie podklasy, zamiast tego umieść to w swojej AppDelegate
Laszlo
1
umieszczenie tego fragmentu kodu AppDelegaterównież działa, ale nie jest oczywiście lepsze niż tworzenie podklasy. Możesz jednak mieć własne preferencje :)
Brian
10

Jeśli używasz platformy Xamarin, działa to:

screen.TabBarItem.ImageInsets = new UIEdgeInsets(5, 0, -5, 0);
screen.TabBarItem.Title = "";
Jelle
źródło
10

To zadziałało dla mnie

Szybki 4

let array = tabBarController?.customizableViewControllers
for controller in array! {
    controller.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0)
}
Alfi
źródło
2

SWIFT 3.0

Możesz ustawić zestawy obrazów, ustawić górny, lewy, dolny i prawy zgodnie z projektem.

self.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0)
krish
źródło
2

W przypadku systemu iOS 11 musisz zastąpić metodę TraitCollection oprócz ustawienia ImageInsets. Dodaj metodę do podklasy UITabBarController

public override UITraitCollection TraitCollection {
 get {
  return UITraitCollection.FromHorizontalSizeClass(horizontalSizeClass: UIUserInterfaceSizeClass.Compact);
 }
}
Prashant
źródło
Dobra wskazówka, która pomogła mi rozwiązać problem związany z pozycją obrazu elementu paska kart na iPadzie i iOS 11. Ale przesłonięcie kolekcji cech na poziomie kontrolera widoku jest zbyt trudne, lepiej jest podklasować klasę UITabBar i zastąpić właściwość traitCollection tam. Również zwrócenie kolekcji cech z tylko klasą poziomą spowoduje usunięcie innych właściwości kolekcji cech. return UITraitCollection(traitsFrom: [ super.traitCollection, UITraitCollection(horizontalSizeClass: .compact)])załatwił sprawę dla mnie.
Emmanuel Paris,
1

W Swift 4.2 , UIEdgeInsetsMakejest depricated, zamiast tego należy użyć UIEdgeInsets,

let array = tabBarController?.customizableViewControllers
    for controller in array! {
        controller.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0)
    }
Bappaditya
źródło