Remove tab bar item text, show only image

前端 未结 19 2090
我寻月下人不归
我寻月下人不归 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:14

    Here is a better, more foolproof way to do this other than the top answer:

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

    Put this in your AppDelegate.didFinishLaunchingWithOptions so that it affects all tab bar buttons throughout the life of your app.

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

    code:

    private func removeText() {
        if let items = yourTabBarVC?.tabBar.items {
           for item in items {
              item.title = ""
           }
        }
     }
    
    0 讨论(0)
  • 2020-12-04 07:20

    Swift version of ddiego answer

    Compatible with iOS 11

    Call this function in viewDidLoad of every first child of the viewControllers after setting title of the viewController

    Best Practice:

    Alternativelly as @daspianist suggested in comments

    Make a subclass of like this class BaseTabBarController: UITabBarController, UITabBarControllerDelegate and put this function in the subclass's viewDidLoad

    func removeTabbarItemsText() {
    
        var offset: CGFloat = 6.0
    
        if #available(iOS 11.0, *), traitCollection.horizontalSizeClass == .regular {
            offset = 0.0
        }
    
        if let items = tabBar.items {
            for item in items {
                item.title = ""
                item.imageInsets = UIEdgeInsets(top: offset, left: 0, bottom: -offset, right: 0)
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 07:20

    In my case, same ViewController was used in TabBar and other navigation flow. Inside my ViewController, I have set self.title = "Some Title" which was appearing in TabBar regardless of setting title nil or blank while adding it in tab bar. I have also set imageInsets as follow:

    item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)

    So inside my ViewController, I have handled navigation title as follow:

    if isFromTabBar {
       // Title for NavigationBar when ViewController is added in TabBar
       // NOTE: Do not set self.title = "Some Title" here as it will set title of tabBarItem
       self.navigationItem.title = "Some Title"
    } else {
       // Title for NavigationBar when ViewController is opened from navigation flow
       self.title = "Some Title"
    }
    
    0 讨论(0)
  • 2020-12-04 07:20

    Custom TabBar - iOS 13, Swift 5, XCode 11

    • TabBar items without text
    • TabBar items centered vertically
    • Rounded TabBar view
    • TabBar Dynamic position and frames

    Storyboard based. It can be achieved easily programmatically too. Only 4 Steps to follow:

    1. Tab Bar Icons must be in 3 sizes, in black color. Usually, I download from fa2png.io - sizes: 25x25, 50x50, 75x75. PDF image files do not work!

    2. In Storyboard for the tab bar item set the icon you want to use through Attributes Inspector. (see screenshot)

    1. Custom TabBarController -> New File -> Type: UITabBarController -> Set on storyboard. (see screenshot)

    1. UITabBarController class

      class RoundedTabBarViewController: UITabBarController {

      override func viewDidLoad() {
          super.viewDidLoad()
      
          // Do any additional setup after loading the view.
          // Custom tab bar view
          customizeTabBarView()
      }
      
      private func customizeTabBarView() {
          let tabBarHeight = tabBar.frame.size.height
          self.tabBar.layer.masksToBounds = true
          self.tabBar.isTranslucent = true
          self.tabBar.barStyle = .default
          self.tabBar.layer.cornerRadius = tabBarHeight/2
          self.tabBar.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]
      }
      
      override func viewDidLayoutSubviews() {
          super.viewDidLayoutSubviews()
          let viewWidth = self.view.bounds.width
          let leadingTrailingSpace = viewWidth * 0.05
      
          tabBar.frame = CGRect(x: leadingTrailingSpace, y: 200, width: viewWidth - (2 * leadingTrailingSpace), height: 49)
      }
      

      }

    2. Result

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

    I used the following code in my BaseTabBarController's viewDidLoad. Note that in my example, I have 5 tabs, and selected image will always be 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)
    }
    
    0 讨论(0)
提交回复
热议问题