Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中更改UITabBarItem的背景色_Ios_Swift_Background Color_Uitabbar_Uitabbaritem - Fatal编程技术网

Ios 在Swift中更改UITabBarItem的背景色

Ios 在Swift中更改UITabBarItem的背景色,ios,swift,background-color,uitabbar,uitabbaritem,Ios,Swift,Background Color,Uitabbar,Uitabbaritem,我只想更改其中一个选项卡bat项目的背景色。我找到了很多链接,但没有得到任何帮助 要求: 这就是我设置选项卡栏项目的方式 let myTabBarItem3 = (self.tabBar.items?[2])! as UITabBarItem myTabBarItem3.image = UIImage(named: "ic_center")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal) myTabBarItem3.sele

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

要求:

这就是我设置选项卡栏项目的方式

 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)
我想要的是中间选项卡栏项目的黑色背景

有什么想法吗


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

您可以将子视图添加到父选项卡栏中 然后可以在子视图上设置背景色。 计算tabBarItem的偏移量和宽度,并在其下插入子视图

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)

您可以使用imageView来实现此效果,请尝试此方法

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

如果只想更改中间
tabBarItem
的背景色,可以按照以下代码进行操作

注意:以下所有代码都在自定义类中使用,该类将UITabBarController扩展为:

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
images默认颜色为灰色,根据用户界面和中心
tabBarItem
images默认颜色为白色

您需要扩展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!
    }
}
试试这个:

 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!
}

这里的addconstraints是什么?这个方法将在视图上添加约束,我知道,但这里的用途是什么。这个方法将在imageView的父视图上调用,我假设它是选项卡。这些约束将设置帧,然后我们才能在屏幕上看到imageView谢谢。。我已经回答了这个问题:还有其他更好的选择吗?谢谢。。我已经在这里给出了这个答案:。此答案适用于选定的选项卡栏项目,因此此方法不适用于您,如果不适用,请在上面使用的位置显示您的代码code@MoinShirazi检查更新后的答案。@Moin Shirazi检查更新后的答案是否为黑色。