UITabBarItem Image nach unten verschieben?

98

Normalerweise haben Sie auf jeder Registerkarte von a UITabBarein kleines Bild und einen Titel, der die Registerkarte benennt. Das Bild wird oben auf der Registerkarte positioniert / zentriert, um den Titel darunter aufzunehmen. Meine Frage ist: Wenn Sie eine Registerkartenleiste mit nur einem Bild und ohne Titel haben möchten, gibt es eine Möglichkeit, das Bild nach unten zu verschieben, damit es besser in der Registerkarte zentriert wird?

Ich benutze (siehe unten) derzeit:

[tabBarItem setFinishedSelectedImage:tabSelected withFinishedUnselectedImage:tabUnselected];

Ich würde es jedoch vorziehen, ein größeres Bild ohne Titel zu verwenden. Wenn ich das Bild im Moment größer als etwa 70 Pixel bei 2x mache, beginnt es, von der Oberseite des Bildes abzuheben, UITabBarwährend unten viel ungenutzter Platz verbleibt.

Fuzzygoat
quelle

Antworten:

178

Versuchen Sie es anzupassen tabBarItem die Werte imageInsets(zum Verschieben des Symbolbilds) und den Titel des Controllers auf Null zu setzen (damit kein Titel angezeigt wird). Fügen Sie so etwas zu -initoder -viewDidLoadMethode in View Controller ein:

Ziel c

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

Schnell

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

UITabBarItemist eine Unterklasse, von UIBarItemder UIEdgeInsets imageInsetsEigentum hat. Spielen Sie ein wenig mit den Einsätzen, bis sie gut aussehen (abhängig von den Bildern Ihrer Registerkartensymbole).

Lukas Kukacka
quelle
3
@ Lukas: aber das verkleinert Bilder.
Sourabh Bhardwaj
1
@Sourabh Schrumpft sie nicht für mich
TigerCoding
7
Der tatsächliche Einschubwert beträgt 5,5 f, wenn er pixelgenau sein soll.
Benutzer
1
@ rr1g0 Das Verschieben des Ausweises an eine benutzerdefinierte Position ist nicht möglich. Wenn Sie eine benutzerdefinierte Position eines Abzeichens oder ein benutzerdefiniertes Abzeichen benötigen, müssen Sie diese selbst implementieren
Lukas Kukacka,
1
@Sourabh Sie müssen den Boden mit einem negativen Wert versetzen, um das Bild nicht zu verkleinern.
Rmalmoe
150

Sie können dies auch über das Storyboard tun. Wählen Sie Ihr Tabbaritem aus, gehen Sie zum Größeninspektor und weisen Sie die entsprechenden Einfügungen zu.

Geben Sie hier die Bildbeschreibung ein

* Demonstriert auf Xcode, Version 7.3.1 (7D1014)

Neil Galiaskarov
quelle
schön und sauber!
Ken
Beste aller Antworten ... Vielen Dank @Neil Galiaskarov
Venkatesh Chejarla
49

Machen Sie eine Unterklasse von UITabBarControllerund in seiner 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
quelle
das hat bei mir funktioniert. Nur dass für schnelle die Methode enumerateObjectsUsingBlock nicht mehr verfügbar ist
Junchao Gu
keine Unterklasse, sondern in Ihr AppDelegate
Laszlo
1
Das Einfügen dieses Snippets AppDelegatefunktioniert auch, aber es ist offensichtlich nicht besser, als es zu unterordnen. Sie können jedoch Ihre eigenen Vorlieben haben :)
Brian
10

Wenn Sie Xamarin verwenden, funktioniert dies:

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

Das hat bei mir funktioniert

Swift 4

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

SWIFT 3.0

Sie können Bild-Sets einstellen, oben, links, unten und rechts entsprechend festlegen.

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

Für iOS 11 müssen Sie die TraitCollection- Methode außer dem Festlegen von ImageInsets überschreiben. Bitte fügen Sie die Methode in Ihre untergeordnete UITabBarController-Klasse ein

public override UITraitCollection TraitCollection {
 get {
  return UITraitCollection.FromHorizontalSizeClass(horizontalSizeClass: UIUserInterfaceSizeClass.Compact);
 }
}
Prashant
quelle
Ein guter Tipp, der mir bei der Lösung eines Problems im Zusammenhang mit der Bildposition für Registerkartenelemente auf iPad und iOS 11 geholfen hat. Es ist jedoch zu hart, die Trait-Sammlung auf View Controller-Ebene zu überschreiben. Es ist besser, die UITabBar-Klasse zu unterordnen und die traitCollection-Eigenschaft zu überschreiben Dort. Wenn Sie eine Merkmalssammlung nur mit der horizontalen Klasse zurückgeben, werden andere Eigenschaftensammlungseigenschaften gelöscht. return UITraitCollection(traitsFrom: [ super.traitCollection, UITraitCollection(horizontalSizeClass: .compact)])hat den Trick für mich gemacht.
Emmanuel Paris
1

In Swift 4.2 , UIEdgeInsetsMakewird depricated, stattdessen sollten wir nutzen UIEdgeInsets,

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