Remove tab bar item text, show only image

前端 未结 19 2087
我寻月下人不归
我寻月下人不归 2020-12-04 06:50

Simple question, how can I remove the tab bar item text and show only the image?

I want the bar items to like in the instagram app:

相关标签:
19条回答
  • 2020-12-04 07:07

    iOS 11 throws a kink in many of these solutions, so I just fixed my issues on iOS 11 by subclassing UITabBar and overriding layoutSubviews.

    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
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 07:07

    A minimal, safe UITabBarController extension in Swift (based on @korgx9 answer):

    extension UITabBarController {
      func removeTabbarItemsText() {
        tabBar.items?.forEach {
          $0.title = ""
          $0.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-04 07:09

    Based on all the great answers on this page, I've crafted another solution that also allows you to show the the title again. Instead of removing the content of title, I just change the font color to transparent.

    extension UITabBarItem {
    
        func setTitleColorFor(normalState: UIColor, selectedState: UIColor) {
            self.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: normalState], for: .normal)
            self.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: selectedState], for: .selected)
        }
    
    }
    
    
    extension UITabBarController {
    
        func hideItemsTitle() {
    
            guard let items = self.tabBar.items else {
                return
            }
    
            for item in items {
                item.setTitleColorFor(normalState: UIColor(white: 0, alpha: 0), selectedState: UIColor(white: 0, alpha: 0))
                item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
            }
    
        }
    
        func showItemsTitle() {
    
            guard let items = self.tabBar.items else {
                return
            }
    
            for item in items {
                item.setTitleColorFor(normalState: .black, selectedState: .yellow)
                item.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            }
    
        }
    
    }
    
    0 讨论(0)
  • 2020-12-04 07:10
    // 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);
    }
    
    0 讨论(0)
  • 2020-12-04 07:10

    Based on the answer of ddiego, in Swift 4.2:

    extension UITabBarController {
        func cleanTitles() {
            guard let items = self.tabBar.items else {
                return
            }
            for item in items {
                item.title = ""
                item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
            }
        }
    }
    

    And you just need to call self.tabBarController?.cleanTitles() in your view controller.

    0 讨论(0)
  • 2020-12-04 07:14

    Here is how you do it in a storyboard.

    Clear the title text, and set the image inset like the screenshot below

    Remember the icon size should follow the apple design guideline

    This means you should have 25px x 25px for @1x, 50px x 50px for @2x, 75px x 75px for @3x

    0 讨论(0)
提交回复
热议问题