向下移动UITabBarItem图像?


98

通常,在的每个标签上,UITabBar您都有一个小图像,并为该标签命名。图像在选项卡顶部定位/居中,以适应下面的标题。我的问题是:如果您想拥有一个只有图像且没有标题的tabBar,是否有办法将图像向下移动,使其在选项卡中更好地居中?

我目前正在使用(见下文):

[tabBarItem setFinishedSelectedImage:tabSelected withFinishedUnselectedImage:tabUnselected];

但是我更喜欢使用没有标题的较大图像,目前,如果我将图像放大到大约70pixels @ 2x左右,它将开始从顶部UITabBar溢出,同时在底部留下大量未使用的空间。

Answers:


179

尝试调整tabBarItemimageInsets(用于移动图标图像)并将控制器标题设置为nil(因此不显示标题)。把这样的事情-init还是-viewDidLoad在视图控制器的方法:

物镜

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

迅速

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

UITabBarItemUIBarItem具有UIEdgeInsets imageInsets属性的子类。稍微玩一些插图,直到看起来不错(取决于您的标签栏图标图像)


3
@Lukas:但这会缩小图像。
Sourabh Bhardwaj 2014年

1
@Sourabh不会为我缩水
TigerCoding 2014年

7
如果您需要完美的像素,则实际的插入值为5.5f。
用户

1
@ rr1g0无法将徽标移动到自定义位置。如果您需要徽章的自定义位置或徽章外观,则必须自己实施
Lukas Kukacka 2015年

1
@Sourabh,您必须使用负值偏移底部以不缩小图像。
Rmalmoe


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

斯威夫特3:

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

这对我有用。只是为了快速使用方法enumerateObjectsUsingBlock不再可用
Junchao Gu

不要子类化,而是将其放到您的AppDelegate中
Laszlo

1
将该代码段放入AppDelegate也可以,但是显然并不比对其进行子类化更好。您可以根据自己的喜好选择:)
Brian Brian

10

如果您使用的是Xamarin,则可以:

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

10

这对我有用

斯威夫特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,除了设置ImageInsets外,还需要重写TraitCollection方法。请在子类的UITabBarController类中添加该方法

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

很好的技巧帮助我解决了与iPad和iOS 11上的选项卡栏项目的图像位置有关的问题。但是在视图控制器级别覆盖trait集合太苛刻了,最好将UITabBar类子类化并覆盖traitCollection属性那里。同样,仅返回带有水平类的特征收集,将删除其他特征收集属性。return UITraitCollection(traitsFrom: [ super.traitCollection, UITraitCollection(horizontalSizeClass: .compact)])为我做了把戏。
伊曼纽尔·巴黎

1

Swift 4.2中,它UIEdgeInsetsMake被描述了,相反,我们应该使用UIEdgeInsets

let array = tabBarController?.customizableViewControllers
    for controller in array! {
        controller.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.