IOS 8标签栏项目背景颜色

时间:2015-05-04 22:31:34

标签: ios swift ios8 uitabbar uitabbaritem

上周我一直试图找到解决方案,在尝试了我能找到或想到的每一个可能的解决方案后,我都没有运气。我找到并尝试过的每一个解决方案要么没有工作,要么已经过时了。

UITabBarItem位于UITabBar内的UITabBarControllerUITabBarItem。我想在选择时更改{{1}}的背景颜色,当然,当所选项目发生变化时,它会更改回来。

我在Xcode 6.3.1中使用Swift和iOS SDK 8.3。如果您只能在Objective-C中回答也没问题,那么任何答案都会有所帮助!提前谢谢大家,我真的很感激!

编辑:这是我希望它做的一个直观的例子。

Different Background Color

5 个答案:

答案 0 :(得分:63)

在你的tabBarController中,你可以设置默认的UITabBar tintColor,barTintColor,selectionIndicatorImage(在这里作弊)和renderMode的图像,见下面的评论:

    class MyTabBarController: UITabBarController, UINavigationControllerDelegate {
      ...
      override func viewDidLoad() {
        ...
        // Sets the default color of the icon of the selected UITabBarItem and Title
        UITabBar.appearance().tintColor = UIColor.redColor()

        // Sets the default color of the background of the UITabBar
        UITabBar.appearance().barTintColor = UIColor.blackColor()

        // Sets the background color of the selected UITabBarItem (using and plain colored UIImage with the width = 1/5 of the tabBar (if you have 5 items) and the height of the tabBar)
        UITabBar.appearance().selectionIndicatorImage = UIImage().makeImageWithColorAndSize(UIColor.blueColor(), size: CGSizeMake(tabBar.frame.width/5, tabBar.frame.height))

        // Uses the original colors for your images, so they aren't not rendered as grey automatically.
        for item in self.tabBar.items as! [UITabBarItem] {
          if let image = item.image {
            item.image = image.imageWithRenderingMode(.AlwaysOriginal)
          }
        }
      }
      ...
    }

并且你想要扩展UIImage类来制作你需要的大小的纯色图像:

extension UIImage {
  func makeImageWithColorAndSize(color: UIColor, size: CGSize) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    color.setFill()
    UIRectFill(CGRectMake(0, 0, size.width, size.height))
    var image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
  }
}

答案 1 :(得分:19)

你可以尝试这个。在AppDelegate.swift

中添加
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        UITabBar.appearance().translucent = false
        UITabBar.appearance().barTintColor = UIColor(rgba: "#12296f")
        UITabBar.appearance().tintColor = UIColor.whiteColor()

        return true
    }

别忘了包含这个图书馆。 https://github.com/yeahdongcn/UIColor-Hex-Swift

答案 2 :(得分:4)

受到Gwendle的启发,这就是我解决它的方式:

strace

并且还使用了扩展名:

override func viewWillAppear(animated: Bool) {
    guard let tabBar = tabBarController?.tabBar else { return }
    tabBar.tintColor = UIColor.whiteColor()
    tabBar.selectionIndicatorImage = UIImage().makeImageWithColorAndSize(UIColor.redColor(), size: CGSizeMake(tabBar.frame.width/5, tabBar.frame.height))
    super.viewWillAppear(animated)
}

请注意,设置extension UIImage { func makeImageWithColorAndSize(color: UIColor, size: CGSize) -> UIImage { UIGraphicsBeginImageContext(size) color.setFill() UIRectFill(CGRectMake(0, 0, size.width, size.height)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } 后,它会为所有其他标签设置。以下是如何删除它的示例,方法是在其余选项卡中的每个其他视图控制器中将其设置为nil:

selectionIndicationImage

使用Swift 2实现。

答案 3 :(得分:0)

你试过这个吗?

在故事板中的视图控制器中选择标签栏图标图像。

在xcode的右侧面板中查看“身份和类型”(最左侧)标签(看起来像一张纸)。

查找全局色调设置。

答案 4 :(得分:0)

您可以从每个传递self.tabBarController的控制器和所需的每种颜色中调用此函数。

功能:

static func customTabBar(controller: UIViewController?, backgroundColor: String, unselectedColor: String, selectedColor: String) {
        if let tabBarController = controller as? UITabBarController {
            tabBarController.tabBar.barTintColor = UIColor(hex: backgroundColor)
            tabBarController.tabBar.tintColor = UIColor(hex: selectedColor)
            tabBarController.tabBar.isTranslucent = false
            tabBarController.tabBar.selectedItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor(hex: selectedColor)], for: UIControl.State.selected)
            if #available(iOS 10.0, *) {
                tabBarController.tabBar.unselectedItemTintColor = UIColor(hex: unselectedColor)
            } else {
                // Fallback on earlier versions
            }
        }
    }