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.

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).


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)


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)
}

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 = "";

10

Das hat bei mir funktioniert

Swift 4

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

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)

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);
 }
}

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)
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.