删除标签栏项目文本,只显示图像

简单的问题,我如何删除标签栏项目文本,只显示图像?

我想要在Instagram应用程序中的酒吧项目喜欢:

在这里输入图像说明

在xcode 6的检查员中,我删除标题并select@ 2x(50px)和@ 3x(75px)图像。 但是图像不使用已删除文本的可用空间。 任何想法如何在instagram应用程序中实现相同的标签栏项目图像?

你应该玩UITabBarItem imageInsets属性。 这里是示例代码:

 let tabBarItem = UITabBarItem(title: nil, image: UIImage(named: "more") tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0) 

UIEdgeInsets值取决于您的图像大小。 这是我的应用程序中的代码的结果:

在这里输入图像说明

 // Remove the titles and adjust the inset to account for missing title for(UITabBarItem * tabBarItem in self.tabBar.items){ tabBarItem.title = @""; tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); } 

这是你如何做故事板。

清除标题文本,并像下面的屏幕截图一样设置图像插入

在这里输入图像说明

请记住图标大小应该遵循苹果devise指南

在这里输入图像说明

这意味着你应该有@ 1x 25px x 25px,@ 2x 2xpx 50px x 50px,@ 3x 75px x 75px

swift ddiego的答案

在设置viewController的标题后,在viewControllers的每个第一个子元素的viewDidLoad中调用这个函数

 func removeTabbarItemsText() { if let items = tabBar.items { for item in items { item.title = "" item.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); } } } 

如果你正在使用故事板,这将是你最好的select。 它遍历所有的标签栏项目,并为每个标题设置为无,并使图像全屏幕。 (您必须在故事板中添加了一张图片)

 for tabBarItem in tabBar.items! { tabBarItem.title = "" tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0) } 

如果在视图控制器self.title被设置,使用方法将每个UITabBarItemtitle属性设置为""并更新imageInsets将无法正常工作。 例如,如果UITabBarController的self.viewControllersembedded在UINavigationController并且需要在导航栏上显示标题。 在这种情况下,直接使用self.navigationItem.title设置UINavigationItem的标题,而不是self.title

我在我的BaseTabBarController的viewDidLoad中使用了下面的代码。 请注意,在我的例子中,我有5个选项卡,选定的图像将始终是base_image +“_selected”。

 // Get tab bar and set base styles let tabBar = self.tabBar; tabBar.backgroundColor = UIColor.whiteColor() // Without this, images can extend off top of tab bar tabBar.clipsToBounds = true // For each tab item.. let tabBarItems = tabBar.items?.count ?? 0 for i in 0 ..< tabBarItems { let tabBarItem = tabBar.items?[i] as UITabBarItem // Adjust tab images (Like mstysf says, these values will vary) tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -6, 0); // Let's find and set the icon's default and selected states // (use your own image names here) var imageName = "" switch (i) { case 0: imageName = "tab_item_feature_1" case 1: imageName = "tab_item_feature_2" case 2: imageName = "tab_item_feature_3" case 3: imageName = "tab_item_feature_4" case 4: imageName = "tab_item_feature_5" default: break } tabBarItem.image = UIImage(named:imageName)!.imageWithRenderingMode(.AlwaysOriginal) tabBarItem.selectedImage = UIImage(named:imageName + "_selected")!.imageWithRenderingMode(.AlwaysOriginal) } 

iOS 11在许多这些解决scheme中引发了一个纠结,所以我只是通过inheritanceUITabBar并重写layoutSubviews来解决我在iOS 11上的问题。

 class MainTabBar: UITabBar { override func layoutSubviews() { super.layoutSubviews() // iOS 11: puts the titles to the right of image for horizontal size class regular. Only want offset when compact. // iOS 9 & 10: always puts titles under the image. Always want offset. var verticalOffset: CGFloat = 6.0 if #available(iOS 11.0, *), traitCollection.horizontalSizeClass == .regular { verticalOffset = 0.0 } let imageInset = UIEdgeInsets( top: verticalOffset, left: 0.0, bottom: -verticalOffset, right: 0.0 ) for tabBarItem in items ?? [] { tabBarItem.title = "" tabBarItem.imageInsets = imageInset } } } 

斯威夫特4的方法

我能够通过实现一个带TabBarItem的函数并对其进行格式化来实现这个function。

将图像向下移动一点以使其更加居中,并隐藏选项卡栏的文本。 工作比只是将其标题设置为空string更好,因为当你有一个NavigationBar时,TabBar在select时重新获得viewController的标题

 func formatTabBarItem(tabBarItem: UITabBarItem){ tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0) tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear], for: .selected) tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear], for: .normal) } 

除了最好的答案,这是一个更好,更简单的方法:

 [[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal]; [[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted]; 

把它放在你的AppDelegate.didFinishLaunchingWithOptions这样它就会影响你应用程序整个生命周期中的所有标签栏button。

Swift中一个最小,安全的UITabBarController扩展(基于@ korgx9答案):

 extension UITabBarController { func removeTabbarItemsText() { tabBar.items?.forEach { $0.title = "" $0.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0) } } }