UITabbar映像未更新

时间:2018-12-29 08:01:56

标签: ios swift uitabbar

我想以编程方式更新uitabbar的图像,但是当我更新图像时并没有更新

看起来重复???

这是我已经尝试过但没有成功的答案

UITabBarItem does not update image

UITabBar not showing selected item images in ios 7

how to programmatically change the tabbarItem's image

https://www.appcoda.com/ios-programming-how-to-customize-tab-bar-background-appearance/

Changing tab bar item image and text color iOS

好的,现在这是我的customTabbar代码

//  CustomTabBarViewController.swift
//  CustomTabBar

import UIKit

class CustomTabBarViewController: UITabBarController, CustomTabBarDataSource, CustomTabBarDelegate, UITabBarControllerDelegate , UISearchBarDelegate, UISearchDisplayDelegate {

    var searchController: UISearchController!
    let  searchBar = UISearchBar()


    var btnBarBadge : MJBadgeBarButton!
     var btnBar : MJBadgeBarButton!



    // @IBOutlet weak var menuButton: UIBarButtonItem!
    // MARK: Properties
    var meals = [CatModel]()

    func onBagdeButtonClick() {
        print("button Clicked \(self.btnBarBadge.badgeValue)")
    }

    func onBarCodeButtonClick() {


        self.title = Localization("Categories")
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let subContentsVC = storyboard.instantiateViewController(withIdentifier: "Stores") as! Stores
        self.navigationController?.pushViewController(subContentsVC, animated: true)

    }


    func buttonClicked(_ sender: AnyObject?) {

        var countt = Int(Constants.cartCount)

        if(countt == nil){

            countt = 0
        }

        if(countt!<1){
            let alert = UIAlertController(title: Localization("Warning"), message:Localization("YourCartisEmpty"), preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: Localization("Ok"), style: .default) { _ in })
            self.present(alert, animated: true){}

        }else{
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let subContentsVC = storyboard.instantiateViewController(withIdentifier: "Cart") as! Cart
            self.navigationController?.pushViewController(subContentsVC, animated: true)
        }
    }

    func searchBarSearchButtonClicked( _ searchBar: UISearchBar)
    {
        print(searchBar.text ?? "this is value")
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let subContentsVC = storyboard.instantiateViewController(withIdentifier: "SearchProduct") as! SearchProduct
        subContentsVC.stringPassed = searchBar.text!
        self.navigationController?.pushViewController(subContentsVC, animated: true)

    }

    func actOnSpecialNotificationon() {
        searchBar.placeholder = Localization("Search")

    }


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.tabBar.isHidden = true
        self.selectedIndex = 1
        self.delegate = self

        searchBar.sizeToFit()
        searchBar.delegate = self
        self.title = Localization("Categories")
        searchBar.placeholder = Localization("Search")
         searchBar.tintColor = .black
        navigationItem.titleView = searchBar


        NotificationCenter.default.addObserver(self, selector: #selector(CustomTabBarViewController.actOnSpecialNotificationon), name: NSNotification.Name(rawValue: mySpecialNotificationKey), object: nil)



        let customTabBar = CustomTabBar(frame: self.tabBar.frame)
        customTabBar.datasource = self
        customTabBar.delegate = self
        customTabBar.setup()

        self.view.addSubview(customTabBar)



        let customButton = UIButton(type: UIButtonType.custom)
        customButton.frame = CGRect(x: 0, y: 0, width: 5.0, height: 35.0)
        customButton.addTarget(self, action: #selector(self.onBagdeButtonClick), for: .touchUpInside)
        customButton.setImage(UIImage(named: "Cart"), for: .normal)

        let barcodeButton = UIButton(type: UIButtonType.custom)
        barcodeButton.frame = CGRect(x: 0, y: 0, width: 35.0, height: 35.0)
        barcodeButton.addTarget(self, action: #selector(self.onBarCodeButtonClick), for: .touchUpInside)
        barcodeButton.setImage(UIImage(named: "edit_location"), for: .normal)



        self.btnBarBadge = MJBadgeBarButton()
        self.btnBar = MJBadgeBarButton()
        self.btnBarBadge.setup(customButton: customButton)
        self.btnBarBadge.removeBadge()
        self.btnBar.setup(customButton: barcodeButton)
         self.btnBar.removeBadge()

        self.btnBarBadge.badgeValue = "0"
        self.btnBarBadge.badgeOriginX = 2.0
        self.btnBarBadge.badgeOriginY = -4

        self.navigationItem.rightBarButtonItem = self.btnBarBadge

          self.navigationItem.rightBarButtonItems = [self.btnBarBadge,self.btnBar]


        customButton.addTarget(self, action: #selector(CustomTabBarViewController.buttonClicked(_:)), for: .touchUpInside)

    }


    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.setNavigationBarItem()

        self.btnBarBadge.badgeValue = Constants.cartCount

    }


    // MARK: - CustomTabBarDataSource

    func tabBarItemsInCustomTabBar(_ tabBarView: CustomTabBar) -> [UITabBarItem] {
        return tabBar.items!
    }

    // MARK: - CustomTabBarDelegate

    func didSelectViewController(_ tabBarView: CustomTabBar, atIndex index: Int) {

        if(index == 0){
        self.openLeftMenu()

        }else{
            self.selectedIndex = index
        }
        for loop in 0..<(self.tabBar.items?.count)!{
            let barbutton = self.tabBar.items![loop]

            if(index == loop){

                barbutton.image =  self.updateImageColor(origImage: barbutton.image!, color: .green)
            }else{
                barbutton.image =  self.updateImageColor(origImage: barbutton.image!, color: .lightGray)
            }
        }
    }
    func updateImageColor(origImage:UIImage,color:UIColor)->UIImage{

        let tintedImage = origImage.withRenderingMode(.alwaysOriginal)
        let imageview = UIImageView(image: tintedImage)
        imageview.tintColor = color
        return imageview.image!
    }

    // MARK: - UITabBarControllerDelegate

    func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        return CustomTabAnimatedTransitioning()
    }

}

这是CustomTabBar.swift的代码

//
//  CustomTabBar.swift
//  CustomTabBar
//

import UIKit

protocol CustomTabBarDataSource {
    func tabBarItemsInCustomTabBar(_ tabBarView: CustomTabBar) -> [UITabBarItem]
}

protocol CustomTabBarDelegate {
    func didSelectViewController(_ tabBarView: CustomTabBar, atIndex index: Int)
}

class CustomTabBar: UIView {

    var datasource: CustomTabBarDataSource!
    var delegate: CustomTabBarDelegate!

    var tabBarItems: [UITabBarItem]!
    var customTabBarItems: [CustomTabBarItem]!
    var tabBarButtons: [UIButton]!

    var initialTabBarItemIndex: Int!
    var selectedTabBarItemIndex: Int!
    var slideMaskDelay: Double!
    var slideAnimationDuration: Double!

    var tabBarItemWidth: CGFloat!
    var leftMask: UIView!
    var rightMask: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)

        self.backgroundColor = UIColor.white
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setup() {
        // get tab bar items from default tab bar
        tabBarItems = datasource.tabBarItemsInCustomTabBar(self)

        customTabBarItems = []
        tabBarButtons = []

        initialTabBarItemIndex = 1
        selectedTabBarItemIndex = initialTabBarItemIndex

        slideAnimationDuration = 0.6
        slideMaskDelay = slideAnimationDuration / 2

        let containers = createTabBarItemContainers()

        createTabBarItemSelectionOverlay(containers)
        createTabBarItemSelectionOverlayMask(containers)
        createTabBarItems(containers)
    }

    func createTabBarItemSelectionOverlay(_ containers: [CGRect]) {

        let activeColor =  UIColor(red: 109/255, green: 187/255, blue: 16/255, alpha: 1.0)


        let overlayColors = [activeColor, activeColor, activeColor, activeColor,activeColor]

        for index in 0..<tabBarItems.count {

            let container = containers[index]

            let view = UIView(frame: container)

            let selectedItemOverlay = UIView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height))
            selectedItemOverlay.backgroundColor =  overlayColors[index] //.clear


            view.addSubview(selectedItemOverlay)
            tabBarItems[index].selectedImage = updateImageColor(origImage: tabBarItems[index].image!, color: .green)
            self.addSubview(view)
        }
    }
    func updateImageColor(origImage:UIImage,color:UIColor)->UIImage{

        let tintedImage = origImage.withRenderingMode(.alwaysTemplate)
        let imageview = UIImageView(image: tintedImage)
        imageview.tintColor = color
        return imageview.image!
    }

    func createTabBarItemSelectionOverlayMask(_ containers: [CGRect]) {

        tabBarItemWidth = self.frame.width / CGFloat(tabBarItems.count)
        let leftOverlaySlidingMultiplier = CGFloat(initialTabBarItemIndex) * tabBarItemWidth
        let rightOverlaySlidingMultiplier = CGFloat(initialTabBarItemIndex + 1) * tabBarItemWidth

        leftMask = UIView(frame: CGRect(x: 0, y: 0, width: leftOverlaySlidingMultiplier, height: self.frame.height))
        leftMask.backgroundColor = UIColor.white
        rightMask = UIView(frame: CGRect(x: rightOverlaySlidingMultiplier, y: 0, width: tabBarItemWidth * CGFloat(tabBarItems.count - 1), height: self.frame.height))
        rightMask.backgroundColor = UIColor.white

        self.addSubview(leftMask)
        self.addSubview(rightMask)
    }

    func createTabBarItems(_ containers: [CGRect]) {

        var index = 0
        for item in tabBarItems {

            let container = containers[index]

            let customTabBarItem = CustomTabBarItem(frame: container)
            customTabBarItem.setup(item)

            self.addSubview(customTabBarItem)
            customTabBarItems.append(customTabBarItem)

            let button = UIButton(frame: CGRect(x: 0, y: 0, width: container.width, height: container.height))
            button.addTarget(self, action: #selector(CustomTabBar.barItemTapped(_:)), for: UIControlEvents.touchUpInside)

            customTabBarItem.addSubview(button)
            tabBarButtons.append(button)

            index += 1
        }

        self.customTabBarItems[initialTabBarItemIndex].iconView.tintColor = .green //UIColor.white
    }

    func createTabBarItemContainers() -> [CGRect] {

        var containerArray = [CGRect]()

        // create container for each tab bar item
        for index in 0..<tabBarItems.count {
            let tabBarContainer = createTabBarContainer(index)
            containerArray.append(tabBarContainer)
        }

        return containerArray
    }

    func createTabBarContainer(_ index: Int) -> CGRect {

        let tabBarContainerWidth = self.frame.width / CGFloat(tabBarItems.count)
        let tabBarContainerRect = CGRect(x: tabBarContainerWidth * CGFloat(index), y: 0, width: tabBarContainerWidth, height: self.frame.height)

        return tabBarContainerRect
    }

    func animateTabBarSelection(from: Int, to: Int) {

        let overlaySlidingMultiplier = CGFloat(to - from) * tabBarItemWidth

        let leftMaskDelay: Double
        let rightMaskDelay: Double
        if overlaySlidingMultiplier > 0 {
            leftMaskDelay = slideMaskDelay
            rightMaskDelay = 0
        }
        else {
            leftMaskDelay = 0
            rightMaskDelay = slideMaskDelay
        }

        UIView.animate(withDuration: slideAnimationDuration - leftMaskDelay, delay: leftMaskDelay, options: UIViewAnimationOptions(), animations: {
            self.leftMask.frame.size.width += overlaySlidingMultiplier
            }, completion: nil)

        UIView.animate(withDuration: slideAnimationDuration - rightMaskDelay, delay: rightMaskDelay, options: UIViewAnimationOptions(), animations: {
            self.rightMask.frame.origin.x += overlaySlidingMultiplier
            self.rightMask.frame.size.width += -overlaySlidingMultiplier
            self.customTabBarItems[from].iconView.tintColor = UIColor.black
            self.customTabBarItems[to].iconView.tintColor = UIColor.white

            }, completion: nil)

    }

    func barItemTapped(_ sender : UIButton) {
        let index = tabBarButtons.index(of: sender)!


      //tabBarItems[index].selectedImage = nil
    //tabBarItems[index].image = nil
        // tabBarItems[index].image =  UIImage(named: "Home_Tab");

        animateTabBarSelection(from: selectedTabBarItemIndex, to: index)
        selectedTabBarItemIndex = index
        delegate.didSelectViewController(self, atIndex: index)
    }
}

当我尝试更改图像时没有任何反应

tabBarItems[index].image =  UIImage(named: "Home_Tab")

tabBarItems[index].image =  UIImage(named: "Home_Tab")?.withRenderingMode(.alwaysOriginal)

与所选图片相同

当我在 createTabBarItemSelectionOverlay 方法中设置图像时,它可以工作

我尝试删除图像并再次设置它,但没有成功 还尝试使用.alwaysOriginal渲染模式设置图像,没有运气

请帮助我在哪里做错了?

谢谢...将为您提供一点帮助

0 个答案:

没有答案