Перемещение изображения UITabBarItem вниз?


98

Обычно на каждой вкладке у UITabBarвас есть небольшое изображение и название вкладки. Изображение располагается по центру вверху вкладки, чтобы разместить заголовок под ним. Мой вопрос: если вы хотите иметь tabBar только с изображением и без заголовка, есть ли способ переместить изображение вниз, чтобы оно лучше центрировалось внутри вкладки?

В настоящее время я использую (см. Ниже):

[tabBarItem setFinishedSelectedImage:tabSelected withFinishedUnselectedImage:tabUnselected];

но предпочел бы использовать более крупное изображение без заголовка, на данный момент, если я сделаю изображение больше, чем примерно 70 пикселей @ 2x, оно начнет срезаться сверху UITabBar, оставляя много неиспользуемого места внизу.

Ответы:


180

Попробуйте изменить tabBarItem«s imageInsets(для перемещения изображения значка) и установки названия контроллеров к нулю (так не отображаются названия). Поместите что-то вроде этого в -initor -viewDidLoadmethod в контроллер представления:

Цель-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является подклассом, у UIBarItemкоторого есть UIEdgeInsets imageInsetsсвойство. Поиграйте немного со вставками, пока они не будут хорошо выглядеть (в зависимости от изображений значков на панели вкладок)


3
@Lukas: но это сжимает изображения.
Сураб Бхардвадж

1
@Sourabh Не сжимает их для меня
TigerCoding

7
Фактическое значение вставки - 5.5f, если вам нужно, чтобы оно было идеальным по пикселям.
пользователь

1
@ rr1g0 Перемещение значка в произвольное положение невозможно. Если вам нужно изменить положение значка или внешний вид значка, вы должны реализовать это самостоятельно,
Лукас Кукачка

1
@Sourabh вы должны сместить нижнюю часть с отрицательным значением, чтобы не сжимать изображение.
Rmalmoe

150

Вы также можете сделать это с помощью раскадровки. Выберите свой tabbaritem, перейдите в инспектор размеров и назначьте соответствующие вставки.

введите описание изображения здесь

* Продемонстрировано на Xcode, версия 7.3.1 (7D1014)


красиво и чисто!
ken

Лучший из всех ответов ... Большое спасибо @Neil Galiaskarov
Venkatesh Chejarla

49

Сделайте подкласс UITabBarController, и в нем 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)
}

это сработало для меня. просто для быстрого метода enumerateObjectsUsingBlock больше не доступен
Джунчао Гу

не создавайте подклассы, вместо этого поместите это в свой AppDelegate
Laszlo

1
вставка этого фрагмента AppDelegateтакже работает, но это, очевидно, не лучше, чем создание подкласса. Хотя у вас могут быть свои предпочтения :)
Брайан,

10

Если вы используете Xamarin, это работает:

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

10

Это сработало для меня

Swift 4

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

2

SWIFT 3.0

Вы можете установить настройки изображения, установить верхний, левый, нижний и правый угол в соответствии с дизайном.

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

2

Для iOS 11 вам необходимо переопределить метод TraitCollection помимо настройки ImageInsets. Пожалуйста, добавьте метод в свой подкласс UITabBarController

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

Хороший совет, который помог мне решить проблему, связанную с положением изображения для элемента панели вкладок на iPad и iOS 11. Но слишком сложно переопределить коллекцию признаков на уровне контроллера представления, лучше создать подкласс класса UITabBar и переопределить свойство traitCollection. там. Также при возврате коллекции признаков только с горизонтальным классом будут отброшены другие свойства коллекции признаков. return UITraitCollection(traitsFrom: [ super.traitCollection, UITraitCollection(horizontalSizeClass: .compact)])сделал трюк для меня.
Эммануэль Пэрис,

1

В Swift 4.2 , UIEdgeInsetsMakeявляется depricated, вместо этого мы должны использовать UIEdgeInsets,

let array = tabBarController?.customizableViewControllers
    for controller in array! {
        controller.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0)
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.