【问题标题】:Tab bar item not highlighted when a tab is selected programmatically with custom tab bar使用自定义选项卡栏以编程方式选择选项卡时,选项卡栏项目未突出显示
【发布时间】:2018-10-04 15:53:40
【问题描述】:

我有一个自定义标签栏,它的中心有一个更大的标签栏项目。

如果我使用自定义标签栏并以编程方式选择一个标签,标签栏项目将不会突出显示。只有当我手动按下标签时它才会突出显示:

    let controller1 = ....
    controller1.tabBarItem = UITabBarItem(..)

    let controller2 = ...
    controller2.tabBarItem = UITabBarItem(..)

    let controller3 = ...
    controller3.tabBarItem = UITabBarItem(..)

    let controller4 = ...
    controller4.tabBarItem = UITabBarItem(..)

    let tabBarController = UITabBarController()
    tabBarController.viewControllers = [controller1, controller2, controller3, controller4];

    let myTabBar = MainTabBar()
    tabBarController.setValue(myTabBar, forKey: "tabBar")
    tabBarController.selectedIndex = 0 //tab bar item wont highlight!

    self.window?.rootViewController = tabBarController;
    self.window?.makeKeyAndVisible()

但是,如果我删除自定义标签栏,它会起作用:

    let controller1 = ....
    controller1.tabBarItem = UITabBarItem(..)

    let controller2 = ...
    controller2.tabBarItem = UITabBarItem(..)

    let controller3 = ...
    controller3.tabBarItem = UITabBarItem(..)

    let controller4 = ...
    controller4.tabBarItem = UITabBarItem(..)

    let tabBarController = UITabBarController()
    tabBarController.viewControllers = [controller1, controller2, controller3, controller4];

    //let myTabBar = MainTabBar()
    //tabBarController.setValue(myTabBar, forKey: "tabBar")
    tabBarController.selectedIndex = 0 //tab bar item WILL highlight!

    self.window?.rootViewController = tabBarController;
    self.window?.makeKeyAndVisible()

这是我的自定义标签栏,用于实现更大的中心按钮:

import UIKit

class MainTabBar: UITabBar {

private var middleButton : UIButton?
var middleButtonPressed: ()->() = {}

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    guard let middleButton = middleButton else {
        return super.hitTest(point, with: event)
    }
    if self.isHidden {
        return super.hitTest(point, with: event)
    }

    let from = point
    let to = middleButton.center

    return sqrt((from.x - to.x) * (from.x - to.x) + (from.y - to.y) * (from.y - to.y)) <= 39 ? middleButton : super.hitTest(point, with: event)
}

func showMiddleButton() {
    if middleButton == nil {
        let size : CGFloat = 48.0
        middleButton = UIButton(frame: CGRect(x: 0.5 * (self.bounds.size.width - size), y: 10.0 - size, width: size, height: size))
        if let middleButton = middleButton {
            middleButton.backgroundColor = ThemeManager.currentTheme().mainColor
            middleButton.layer.shadowOffset = CGSize(width: 0, height: 5)
            middleButton.layer.shadowOpacity = 1
            if middleButton.backgroundColor == UIColor.white {
                middleButton.layer.shadowColor = UIColor(red:0.14, green:0.06, blue:0.21, alpha:0.86).cgColor
                middleButton.layer.shadowRadius = 28
            }else{
                middleButton.layer.shadowColor = UIColor(red:0.14, green:0.06, blue:0.21, alpha:0.29).cgColor
                middleButton.layer.shadowRadius = 20
            }
            middleButton.layer.cornerRadius = 0.5 * size
            middleButton.setTitle("+", for: .normal)
            middleButton.setTitleColor(ThemeManager.currentTheme().tabBarMiddleButtonTitleColor, for: .normal)
            middleButton.titleLabel?.font = UIFont.systemFont(ofSize: 36.0, weight: .light)
            middleButton.titleEdgeInsets.top = -5
            middleButton.addTarget(self, action: #selector(MainTabBar.handlePressed), for: UIControlEvents.touchUpInside)
            self.addSubview(middleButton)
        }
    }
    if let middleButton = middleButton {
        middleButton.isHidden = false
    }
}

func hideMiddleButton(){
    if let middleButton = middleButton {
        middleButton.isHidden = true
    }
}

@objc func handlePressed() {
    middleButtonPressed()
}

}

可能出了什么问题?我只想突出显示以编程方式选择的选项卡。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    最后我意识到,如果我在设置自定义标签栏之后设置视图控制器,它将起作用。

        //this will work
        let tabBarController = UITabBarController()
        let myTabBar = MainTabBar()
        tabBarController.setValue(myTabBar, forKey: "tabBar")
        tabBarController.viewControllers = [controller1, controller2, controller3, controller4];
        tabBarController.selectedIndex = 0
    
        //this will not work
        let tabBarController = UITabBarController()
        tabBarController.viewControllers = [controller1, controller2, controller3, controller4];
        let myTabBar = MainTabBar()
        tabBarController.setValue(myTabBar, forKey: "tabBar")
        tabBarController.selectedIndex = 0
    

    【讨论】:

      【解决方案2】:

      如果所选索引不是 0,则具有自定义标签栏的代码可以正常工作。 试试这个快速破解: 而不是

      let myTabBar = MainTabBar()
      tabBarController.setValue(myTabBar, forKey: "tabBar")
      tabBarController.selectedIndex = 0
      

      试试

      let myTabBar = MainTabBar()
      tabBarController.setValue(myTabBar, forKey: "tabBar")
      tabBarController.selectedIndex = 2 // any index other than 0
      tabBarController.selectedIndex = 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多