如何将 Center Tabbar Item 更改为 Button,其作用类似于 Action Button?

问题描述

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",tag: 1)
        nav3.tabBarItem = UITabBarItem(title: "",image: UIImage(systemName: "plus.app",tag: 1)
        nav4.tabBarItem = UITabBarItem(title: "",image: UIImage(systemName: "heart",tag: 1)
        nav5.tabBarItem = UITabBarItem(title: "",image: UIImage(systemName: "person.circle",tag: 1)

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

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

解决方法

自己发现的。添加 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
}