如何获取自定义标签栏以在Xcode中显示标签栏项目的所选图像集?

时间:2017-03-13 02:05:26

标签: xcode swift3

我已经创建了一个正确显示标签栏项目的自定义标签栏。当我选择标签/图标时,会显示标签栏项目的视图控制器,但图标不会更改为“所选图像”。图标,即图标在显示视图控制器时不会改变。

我做错了什么?如何让图标更新为我在IB上设置的图像作为所选图像?

以下是我的一些代码:

class CustomTabBarController: UITabBarController, CustomTabBarDataSource, CustomTabBarDelegate {
 override func viewDidLoad() {
  super.viewDidLoad()
  self.tabBar.isHidden = true
  let customTabBar = CustomTabBar(frame: self.tabBar.frame)
  customTabBar.datasource = self
  customTabBar.delegate = self
  customTabBar.setup()
  self.view.addSubview(customTabBar)
 }
 // MARK: - CustomTabBarDataSource
 func tabBarItemsInCustomTabBar(_ tabBarView: CustomTabBar) -> [UITabBarItem] {
  return tabBar.items!
 }
 // MARK: - CustomTabBarDelegate
 func didSelectViewController(_ tabBarView: CustomTabBar, atIndex index: Int) {
  self.selectedIndex = index
 }   
}


class CustomTabBar: UIView {
 var tabBarItems: [UITabBarItem]!
 var customTabBarItems: [CustomTabBarItem]!
 var tabBarButtons: [UIButton]!

func setup() {
 tabBarItems = datasource.tabBarItemsInCustomTabBar(self)
 customTabBarItems = []
 tabBarButtons = []
 let containers = createTabBarItemContainers()
 createTabBarItems(containers)
}

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

func barItemTapped(_ sender : UIButton) {
 let index = tabBarButtons.index(of: sender)!
 delegate.didSelectViewController(self, atIndex: index)
}

3 个答案:

答案 0 :(得分:1)

更改

class CustomTabBar: UIView {

为:

class CustomTabBar: UITabBar {

然后您的自定义标签栏就像标签栏一样!

答案 1 :(得分:1)

我有同样的功能,并使用UITabBarController实现。

enum TabType:Int{
case viewController1 = 0
case viewController2 = 1
case viewController3 = 2
}

class CustomTabbarVC: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    convenience init(userType : UserType){
        self.init()
        addViewControllers()
        setupOnInit()

        let tabBar = self.tabBar
        tabBar.selectionIndicatorImage = UIImage().createSelectionIndicator(UIColor(red: 22/255, green: 52/255, blue: 89/255, alpha: 1.0), size: CGSize(width: tabBar.frame.width/CGFloat(tabBar.items!.count), height: tabBar.frame.height), lineWidth: 3.0)
    }


    func setupOnInit(){

        delegate = self
        tabBar.barStyle = UIBarStyle.black
        tabBar.isTranslucent = false
    }

    func addViewControllers(){

        // We will add 3 controllers

        let viewController1 = viewController1(nibName: “viewController1”, bundle: nil)
        let viewController2 = viewController2(nibName: “viewController2”, bundle: nil)
        let viewController3 = viewController3(nibName: “viewController3”, bundle: nil)

        let viewController1Navigation =  UINavigationController(rootViewController: viewController1)
        viewController1Navigation.tabBarItem = getTabbarItem(.viewController1)
        viewController1Navigation.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0)

        let viewController2Navigation =  UINavigationController(rootViewController: viewController2)
        viewController2Navigation.tabBarItem = getTabbarItem(.viewController2)
        viewController2Navigation.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0)

        let viewController3Navigation =  UINavigationController(rootViewController: viewController3)
        viewController3Navigation.tabBarItem = getTabbarItem(.viewController3)
        viewController3Navigation.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0)

        viewControllers = [viewController1Navigation,viewController2Navigation,viewController3Navigation]

    }


    func getTabbarItem(_ tabType:TabType)->UITabBarItem{

        // Fetch tab bar item and set image according to it.

        var image = String()
        var selectedImage = String()

        if tabType == .viewController1{
            image = “img_viewController1_tab_nonSelected”
            selectedImage = “img_viewController1_tab_Selected”
        }else if tabType == .viewController2{
            image = “img_viewController2_tab_nonSelected”
            selectedImage = “img_viewController2_tab_Selected”
        }else if tabType == .viewController3{
            image = “img_viewController3_tab_nonSelected”
            selectedImage = “img_viewController3_tab_Selected”
        }else{
            print("Unknown tab type")
        }

        if let imageName:String = image,let selectedImageName:String = selectedImage{
            return UITabBarItem(title: nil, image: UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: selectedImageName)?.withRenderingMode(.alwaysOriginal))
        }else{
            return UITabBarItem()
        }
    }

}

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

如何在App委托中实施

class AppDelegate: UIResponder, UIApplicationDelegate{

    var window: UIWindow?
    var customTabbarVC: CustomTabbarVC?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

         window = UIWindow(frame: UIScreen.main.bounds)
         customTabbarVC = customTabbarVC() // It will invoke init methods of customtabbarvc
         window?.rootViewController = customTabbarVC // Here your tab bar controller will setup 

        return true
     }

  // Other APP DELEGATE METHODS

}

如果您有任何疑问,请与我们联系。

答案 2 :(得分:1)

要在单击按钮后更改自定义标签栏按钮中的图像,需要编写代码以更改下面功能中的图像

func barItemTapped(_ sender : UIButton) {
}

类似地

 func barItemTapped(_ sender : UIButton) 
{
    if sender.tag == 1
    {
    tabBarButtons.setImage(UIImage(named:"FirstImage.png"), forState: .Normal)
    }
    else
    {
    tabBarButtons.setImage(UIImage(named:"SecImage.png"), forState: .Normal)
    }
 }