首页 > 解决方案 > 如何将中心选项卡项更改为按钮,其作用类似于操作按钮?

问题描述

final class TabBarViewController: UITabBarController {

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tabBar.backgroundColor = .systemBackground
        self.tabBar.layer.masksToBounds = true
        self.tabBar.layer.cornerRadius = 25
        self.tabBar.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
        self.tabBar.unselectedItemTintColor = .tertiaryLabel
        self.tabBar.tintColor = .label
        setUpControllers()
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tabBar.frame = CGRect(x: 0, y: view.bottom - tabBar.height, width: tabBar.width, height: tabBar.height+10)
    }

    private func setUpControllers() {
        guard let email = UserDefaults.standard.string(forKey: "email"),
              let username = UserDefaults.standard.string(forKey: "username") else {
            return
        }

        let currentUser = User(
            username: username,
            email: email
        )

        let home = HomeViewController()
        let explore = ExploreViewController()
        let editor = EditorViewController()
        let activity = NotificationsViewController()
        let profile = ProfileViewController(user: currentUser)

        let nav1 = UINavigationController(rootViewController: home)
        let nav2 = UINavigationController(rootViewController: explore)
        let nav3 = UINavigationController(rootViewController: editor)
        let nav4 = UINavigationController(rootViewController: activity)
        let nav5 = UINavigationController(rootViewController: profile)
        
        nav1.navigationBar.tintColor = .label
        nav2.navigationBar.tintColor = .label
        nav3.navigationBar.tintColor = .label
        nav4.navigationBar.tintColor = .label
        nav5.navigationBar.tintColor = .label
        
        if #available(iOS 14.0, *) {
            home.navigationItem.backButtonDisplayMode = .minimal
            explore.navigationItem.backButtonDisplayMode = .minimal
            explore.navigationItem.backButtonDisplayMode = .minimal
            activity.navigationItem.backButtonDisplayMode = .minimal
            profile.navigationItem.backButtonDisplayMode = .minimal
        } else {
            nav1.navigationItem.backButtonTitle = ""
            nav2.navigationItem.backButtonTitle = ""
            nav3.navigationItem.backButtonTitle = ""
            nav4.navigationItem.backButtonTitle = ""
            nav5.navigationItem.backButtonTitle = ""
        }

        let boldConfig = UIImage.SymbolConfiguration(weight: .semibold)
        
        nav1.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "house",withConfiguration: boldConfig), tag: 1)
        nav2.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "magnifyingglass",withConfiguration: boldConfig), tag: 1)
        nav3.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "plus.app",withConfiguration: boldConfig), tag: 1)
        nav4.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "heart",withConfiguration: boldConfig), tag: 1)
        nav5.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "person.circle",withConfiguration: boldConfig), tag: 1)

        
        self.setViewControllers(
            [nav1, nav2, nav3, nav4, nav5],
            animated: false
        )
    }
}

这是我用来创建 TabbarController 的代码。如何更改为中心按钮(加号)以充当按钮,它不呈现 ViewController,而是呈现动作,如 CardView。我在 medium 上找到了一篇文章,但这对我不起作用。有人知道答案吗?我觉得他们对这个问题没有太多的解决方案。

标签: uitabbarcontrolleruitabbartabbar

解决方案


自己发现的。添加 UITabBarControllerDelegate 并将委托设置为 self。然后放入这个函数:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    
    if viewController == tabBarController.viewControllers?[2] {
        let vc = EditorViewController()
        vc.modalPresentationStyle = .overFullScreen
        present(vc, animated: false, completion: nil)
        return false
    }
    return true
}

推荐阅读