2017-07-26 183 views
0

我只想更改其中一个选项卡bat项目的背景颜色。我发现很多链接,但没有得到任何帮助。更改Swift中UITabBarItem的背景颜色

要求: enter image description here

而且,这是我的方式设置我的标签栏项目

let myTabBarItem3 = (self.tabBar.items?[2])! as UITabBarItem 
myTabBarItem3.image = UIImage(named: "ic_center")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
myTabBarItem3.selectedImage = UIImage(named: "ic_center")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 

我要的是对中心标签栏项目的黑色背景。

有什么想法?

是的它是不是重复,因为回答了前面的不准确,并增加额外的子视图从来都不是一个好的选择,所以希望从朋友一些好的解决方案

回答

0

您可以将子视图添加到parent tabBar 然后,您可以在子视图上设置背景颜色。 计算tabBarItem的偏移量和宽度,并在其下插入subView。

let itemIndex = 2 
let bgColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1.0) 

let itemWidth = tabBar.frame.width/CGFloat(tabBar.items!.count) 
let bgView = UIView(frame: CGRectMake(itemWidth * itemIndex, 0, itemWidth, tabBar.frame.height)) 
bgView.backgroundColor = bgColor 
tabBar.insertSubview(bgView, atIndex: 0) 
+0

谢谢你..我已经通过这个答案在这里:https:// stacko verflow.com/a/26753432/4033273 –

+0

还有其他更好的选择吗? –

0

可以使用的ImageView来实现这一影响,如果你只想改变中心tabBarItem的背景颜色,你可以按照下面的代码试试这个办法

let myImageView: UIImageView = { 
     let imageView = UIImageView() 
     return imageView 
    }() 
    //Now add this imageView as subview and apply constraints 
    tabbar.addSubview(myImageView) 
    myImageView.translatesAutoresizingMaskIntoConstraints = false   
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[v0(28)]", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": myImageView])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[v0(28)]", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": myImageView])) 



    tabbar.myImageView.image = UIImage(named: "ic_center")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) 
    tabbar.myImageView.tintColor = UIColor.black 
+0

什么是addconstraints这里? –

+0

这个方法会在视图上添加约束, – 3stud1ant3

+0

那我知道但是这里有什么用 –

0

注:根据您的用户界面和中心tabBarItem图像默认颜色为白色

class tabbarVCViewController: UITabBarController, UITabBarControllerDelegate { 

    // MARK: - ViewController Override Methods. 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     setupInitilView() 
    } 

    // MARK: - setup Initial View Methode. 
    private func setupInitilView() { 

     delegate = self 

     // Sets the default color of the icon of the selected UITabBarItem and Title 
     UITabBar.appearance().tintColor = UIColor.white 

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

     // 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(color: UIColor.black, size: CGSize.init(width: tabBar.frame.width/4, height: 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! { 
      if let image = item.image { 

       //item.image = image.withRenderingMode(.alwaysTemplate) 

       item.image = image.withRenderingMode(.alwaysOriginal) //Use default image colour as grey colour and your centre image default colour as white colour as your requirement. 
      } 
     } 

     //Change the backgound colour of specific tabBarItem. 

     let itemIndex:CGFloat = 2.0 

     let bgColor = UIColor.black 
     let itemWidth = tabBar.frame.width/CGFloat(tabBar.items!.count) 
     let bgView = UIView(frame: CGRect.init(x: itemWidth * itemIndex, y: 0, width: itemWidth, height: tabBar.frame.height)) 
     bgView.backgroundColor = bgColor 
     tabBar.insertSubview(bgView, at: 0) 

    } 

    // MARK: - UITabbarController Override Methods . 
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { 

    } 


    // MARK: - UITabBarControllerDelegate Methods 
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 

     return true 
    } 
} 

使用tabBarItem图像默认颜色为灰色:下面所有的代码在一个延伸的UITabBarController作为一个自定义类使用资产中。

你将要扩展的UIImage类,以与大小素色图像,你需要:

extension UIImage { 
    func makeImageWithColorAndSize(color: UIColor, size: CGSize) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(size, false, 0) 
     color.setFill() 
     UIRectFill(CGRect.init(x: 0, y: 0, width: size.width, height: size.height)) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image! 
    } 
} 
+0

谢谢你..我已经通过这个答案在这里:https://stackoverflow.com/a/31680820/4033273。这个答案适用于选中的标签栏 –

+0

所以这种方法不适合你,如果不是,你可以在上面的代码中使用代码 –

+0

@Moin Shirazi检查更新后的答案。 –

0

试试这个:

UITabBar.appearance().tintColor = UIColor.pink 
UITabBar.appearance().barTintColor = UIColor.white 
      if #available(iOS 10.0, *) { 
       UITabBar.appearance().unselectedItemTintColor = UIColor.white 
      } else { 
       // Fallback on earlier versions 
      } 
let x = Double(UIScreen.main.bounds.width/5.0) 
let y = Double(tabBarController!.tabBar.frame.size.height) 
let indicatorBackground: UIImage? = self.image(from: UIColor.black, for: CGSize(width: x, height: y)) 
UITabBar.appearance().selectionIndicatorImage = indicatorBackground 

辅助方法

func image(from color: UIColor, for size: CGSize) -> UIImage { 
    let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) 
    autoreleasepool { 
     UIGraphicsBeginImageContext(rect.size) 
    } 
    let context: CGContext? = UIGraphicsGetCurrentContext() 
    context?.setFillColor(color.cgColor) 
    context?.fill(rect) 
    let image: UIImage? = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image! 
}