Make custom button on Tab Bar rounded

后端 未结 4 1997
无人及你
无人及你 2020-11-30 19:34

Here is what I am trying to do:

Note: The screenshot is taken from an earlier version of iOS

What I have been able to achieve:

Code:



        
相关标签:
4条回答
  • 2020-11-30 19:57

    Swift 3 Solution

    With a slight adjustment to EricB's solution to have this work for Swift 3, the menuButton.addTarget() method needs to have it's selector syntax changed a bit.

    Here is the new menuButton.addTarget() function:

    menuButton.addTarget(self, action: #selector(MyTabBarController.menuButtonAction), for: UIControlEvents.touchUpInside)

    When defining my TabBarController class, I also add a UITabBarControllerDelegate and placed all of the that in the

    override func viewDidAppear(_ animated: Bool) { ... }

    For extra clarity, the full code is:

    Full Code Solution

    import UIKit
    
    class MyTabBarController: UITabBarController, UITabBarControllerDelegate {
    
    // View Did Load
    override func viewDidLoad() {
        super.viewDidLoad()
    
    }
    
    // Tab Bar Specific Code
    override func viewDidAppear(_ animated: Bool) {
        let controller1 = UIViewController(self.view.backgroundColor = UIColor.white)
        controller1.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.contacts, tag: 1)
        let nav1 = UINavigationController(rootViewController: controller1)
    
        let controller2 = UIViewController()
        controller2.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.contacts, tag: 2)
        let nav2 = UINavigationController(rootViewController: controller2)
    
        let controller3 = UIViewController()
        let nav3 = UINavigationController(rootViewController: controller3)
        nav3.title = ""
    
        let controller4 = UIViewController()
        controller4.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.contacts, tag: 4)
        let nav4 = UINavigationController(rootViewController: controller4)
    
        let controller5 = UIViewController()
        controller5.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.contacts, tag: 5)
        let nav5 = UINavigationController(rootViewController: controller5)
    
        self.viewControllers = [nav1, nav2, nav3, nav4, nav5]
        self.setupMiddleButton()
    }
    
    // TabBarButton – Setup Middle Button
    func setupMiddleButton() {
        let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64))
        var menuButtonFrame = menuButton.frame
        menuButtonFrame.origin.y = self.view.bounds.height - menuButtonFrame.height
        menuButtonFrame.origin.x = self.view.bounds.width / 2 - menuButtonFrame.size.width / 2
        menuButton.frame = menuButtonFrame
    
        menuButton.backgroundColor = UIColor.red
        menuButton.layer.cornerRadius = menuButtonFrame.height/2
        self.view.addSubview(menuButton)
    
        menuButton.setImage(UIImage(named: "example"), for: UIControlState.normal)
        menuButton.addTarget(self, action: #selector(MyTabBarController.menuButtonAction), for: UIControlEvents.touchUpInside)
    
        self.view.layoutIfNeeded()
    }
    
    // Menu Button Touch Action
    func menuButtonAction(sender: UIButton) {
        self.selectedIndex = 2
        // console print to verify the button works
        print("Middle Button was just pressed!")
       }
     }
    
    0 讨论(0)
  • 2020-11-30 20:07

    This is the customTabbarcontroller class which is the subclass of UITabbarcontroller. It's the same idea as given by @EridB. But in his code @Raymond26's issue wasn't solved. So, posting a complete solution written in Swift 3.0

    protocol CustomTabBarControllerDelegate
    {
        func customTabBarControllerDelegate_CenterButtonTapped(tabBarController:CustomTabBarController, button:UIButton, buttonState:Bool);
    }
    
    class CustomTabBarController: UITabBarController, UITabBarControllerDelegate
    {
        var customTabBarControllerDelegate:CustomTabBarControllerDelegate?;
        var centerButton:UIButton!;
        private var centerButtonTappedOnce:Bool = false;
    
        override func viewDidLayoutSubviews()
        {
            super.viewDidLayoutSubviews();
    
            self.bringcenterButtonToFront();
        }
    
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            self.delegate = self;
    
            self.tabBar.barTintColor = UIColor.red;
    
            let dashboardVC = DashboardViewController()        
            dashboardVC.tabBarItem = UITabBarItem(tabBarSystemItem: .topRated, tag: 1)
            let nav1 = UINavigationController(rootViewController: dashboardVC)
    
            let myFriendsVC = MyFriendsViewController()
            myFriendsVC.tabBarItem = UITabBarItem(tabBarSystemItem: .featured, tag: 2)
            let nav2 = UINavigationController(rootViewController: myFriendsVC)
    
            let controller3 = UIViewController()
            let nav3 = UINavigationController(rootViewController: controller3)
            nav3.title = ""
    
            let locatorsVC = LocatorsViewController()
            locatorsVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 4)
            let nav4 = UINavigationController(rootViewController: locatorsVC)
    
            let getDirectionsVC = GetDirectionsViewController()
            getDirectionsVC.tabBarItem = UITabBarItem(tabBarSystemItem: .history, tag: 5)
            let nav5 = UINavigationController(rootViewController: getDirectionsVC)
    
            viewControllers = [nav1, nav2, nav3, nav4, nav5]
    
            self.setupMiddleButton()
        }
    
        // MARK: - TabbarDelegate Methods
    
        func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)
        {
            switch viewController
            {
            case is DashboardViewController:
                self.showCenterButton()
            case is MyFriendsViewController:
                self.showCenterButton()
            case is GetDirectionsViewController:
                self.showCenterButton()
            case is LocatorsViewController:
                self.showCenterButton()
            default:
                self.showCenterButton()
            }
        }
    
        // MARK: - Internal Methods
    
        @objc private func centerButtonAction(sender: UIButton)
        {
            //        selectedIndex = 2
            if(!centerButtonTappedOnce)
            {
                centerButtonTappedOnce=true;
                centerButton.setImage(UIImage(named: "ic_bullseye_white"), for: .normal)
            }
            else
            {
                centerButtonTappedOnce=false;
                centerButton.setImage(UIImage(named: "ic_bullseye_red"), for: .normal)
            }
    
            customTabBarControllerDelegate?.customTabBarControllerDelegate_CenterButtonTapped(tabBarController: self,
                                                                                              button: centerButton,
                                                                                              buttonState: centerButtonTappedOnce);
        }
    
        func hideCenterButton()
        {
            centerButton.isHidden = true;
        }
    
        func showCenterButton()
        {
            centerButton.isHidden = false;
            self.bringcenterButtonToFront();
        }
    
        // MARK: - Private methods
    
        private func setupMiddleButton()
        {
            centerButton = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64))
    
            var centerButtonFrame = centerButton.frame
            centerButtonFrame.origin.y = view.bounds.height - centerButtonFrame.height
            centerButtonFrame.origin.x = view.bounds.width/2 - centerButtonFrame.size.width/2
            centerButton.frame = centerButtonFrame
    
            centerButton.backgroundColor = UIColor.red
            centerButton.layer.cornerRadius = centerButtonFrame.height/2
            view.addSubview(centerButton)
    
            centerButton.setImage(UIImage(named: "ic_bullseye_red"), for: .normal)
            centerButton.setImage(UIImage(named: "ic_bullseye_white"), for: .highlighted)
            centerButton.addTarget(self, action: #selector(centerButtonAction(sender:)), for: .touchUpInside)
    
            view.layoutIfNeeded()
        }
    
        private func bringcenterButtonToFront()
        {
            print("bringcenterButtonToFront called...")
            self.view.bringSubview(toFront: self.centerButton);
        }
    
    }
    

    This is the DashboardViewController for complete reference:

    class DashboardViewController: BaseViewController, CustomTabBarControllerDelegate
    {
        override func viewDidLoad()
        {
            super.viewDidLoad()
            (self.tabBarController as! CustomTabBarController).customTabBarControllerDelegate = self;
        }
    
        override func viewWillAppear(_ animated: Bool)
        {
            super.viewWillAppear(animated);
            (self.tabBarController as! CustomTabBarController).showCenterButton();
        }
    
        override func viewWillDisappear(_ animated: Bool)
        {
            super.viewWillDisappear(animated);
    
            self.hidesBottomBarWhenPushed = false;
            (self.tabBarController as! CustomTabBarController).hideCenterButton();
        }
    
        override func viewWillLayoutSubviews()
        {
            super.viewWillLayoutSubviews();
    
            if(!isUISetUpDone)
            {
                self.view.backgroundColor = UIColor.lightGray
                self.title = "DASHBOARD"
                self.prepareAndAddViews();
                self.isUISetUpDone = true;
            }
        }
    
        override func didReceiveMemoryWarning()
        {
            super.didReceiveMemoryWarning()
        }
    
        //MARK: CustomTabBarControllerDelegate Methods
    
        func customTabBarControllerDelegate_CenterButtonTapped(tabBarController: CustomTabBarController, button: UIButton, buttonState: Bool)
        {
            print("isDrive ON : \(buttonState)");
        }
    
        //MARK: Internal Methods
    
        func menuButtonTapped()
        {
            let myFriendsVC = MyFriendsViewController()
            myFriendsVC.hidesBottomBarWhenPushed = true;
            self.navigationController!.pushViewController(myFriendsVC, animated: true);
        }
    
        //MARK: Private Methods
    
        private func prepareAndAddViews()
        {
            let menuButton = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
            menuButton.titleLabel?.text = "Push"
            menuButton.titleLabel?.textColor = UIColor.white
            menuButton.backgroundColor = UIColor.red;
            menuButton.addTarget(self, action: #selector(DashboardViewController.menuButtonTapped), for: .touchUpInside)
            self.view.addSubview(menuButton);
        }
    }
    
    0 讨论(0)
  • 2020-11-30 20:14

    with StoryBoard: Click the tab bar button within the view controller of the particular tab bar item you want to make prominent,

    Remove the text, just set the image inset top to -25 of the tab bar button. Check Like Below image

    0 讨论(0)
  • 2020-11-30 20:17

    Solution

    You need to subclass UITabBarController and then add the button above TabBar's view. A button action should trigger UITabBarController tab change by setting selectedIndex.

    Code

    The code below only is a simple approach, however for a full supporting iPhone (including X-Series)/iPad version you can check the full repository here: EBRoundedTabBarController

    class CustomTabBarController: UITabBarController {
    
        // MARK: - View lifecycle
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let controller1 = UIViewController()
            controller1.tabBarItem = UITabBarItem(tabBarSystemItem: .contacts, tag: 1)
            let nav1 = UINavigationController(rootViewController: controller1)
    
            let controller2 = UIViewController()
            controller2.tabBarItem = UITabBarItem(tabBarSystemItem: .contacts, tag: 2)
            let nav2 = UINavigationController(rootViewController: controller2)
    
            let controller3 = UIViewController()
            let nav3 = UINavigationController(rootViewController: controller3)
            nav3.title = ""
    
            let controller4 = UIViewController()
            controller4.tabBarItem = UITabBarItem(tabBarSystemItem: .contacts, tag: 4)
            let nav4 = UINavigationController(rootViewController: controller4)
    
            let controller5 = UIViewController()
            controller5.tabBarItem = UITabBarItem(tabBarSystemItem: .contacts, tag: 5)
            let nav5 = UINavigationController(rootViewController: controller5)
    
    
            viewControllers = [nav1, nav2, nav3, nav4, nav5]
            setupMiddleButton()
        }
    
        // MARK: - Setups
    
        func setupMiddleButton() {
            let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64))
    
            var menuButtonFrame = menuButton.frame
            menuButtonFrame.origin.y = view.bounds.height - menuButtonFrame.height
            menuButtonFrame.origin.x = view.bounds.width/2 - menuButtonFrame.size.width/2
            menuButton.frame = menuButtonFrame
    
            menuButton.backgroundColor = UIColor.red
            menuButton.layer.cornerRadius = menuButtonFrame.height/2
            view.addSubview(menuButton)
    
            menuButton.setImage(UIImage(named: "example"), for: .normal)
            menuButton.addTarget(self, action: #selector(menuButtonAction(sender:)), for: .touchUpInside)
    
            view.layoutIfNeeded()
        }
    
    
        // MARK: - Actions
    
        @objc private func menuButtonAction(sender: UIButton) {
            selectedIndex = 2
        }
    }
    

    Output

    0 讨论(0)
提交回复
热议问题