15

I add custom button to navigation controller

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back.png"]
                                                                   style:UIBarButtonItemStylePlain
                                                                  target:self
                                                                  action:@selector(backAction)];
    self.navigationItem.leftBarButtonItem = backButton;

it works fine, but button appears bordered. How can I fix that?

UPDATE I found solution

   
 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
    [button setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonFavoriteClicked) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithCustomView:button];
    [button release];
 
self.navigationItem.leftBarButtonItem = back;

3 Answers 3

18

Try this.

UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, button_width, button_height)];
[backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
Sign up to request clarification or add additional context in comments.

Comments

3

For Swift 4

let backButton = UIButton(frame: CGRect(x: 0, y: 0, width: 25, height: 25))
backButton.setImage(UIImage(named: "back.png"), for: .normal)
backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: backButton)

And action (selector) should be like the following :

@objc func backAction () {
        // do the magic 
}

Comments

0

Adding Button either in left or right with title or without title as per the requirement,

func addBarButton(image: UIImage?, isLeft: Bool = true, title: String? = nil, font: UIFont = UIFont.systemFont(ofSize: 16), tintColor: UIColor = R.color.textfieldColor() ?? .black) {
            if let navController = self.navigationController {
                let navBar = navController.navigationBar
                navBar.isHidden = false
                navBar.isTranslucent = false
                let btn = UIButton.init(type: .custom)
                if let img = image {
                    btn.setImage(img, for: UIControl.State.normal)
                }
                if let titleTxt = title {
                    btn.setTitle(titleTxt, for: .normal)
                    btn.setTitleColor(tintColor, for: .normal)
                    btn.titleLabel?.font = font
                }
                btn.frame = CGRect.init(x: 0, y: 0, width: 35, height: 35)
                btn.adjustsImageWhenHighlighted = false
                let barButton = UIBarButtonItem.init(customView: btn)
                if isLeft {
                    btn.addTarget(self, action: #selector(self.btnLeftNavigationClicked), for: UIControl.Event.touchUpInside)
                    btn.tintColor = tintColor
                    if let tabBar = self.tabBarController {
                        tabBar.navigationItem.leftBarButtonItem = nil
                        tabBar.navigationItem.leftBarButtonItem = barButton
                    } else {
                        self.navigationItem.leftBarButtonItem = nil
                        self.navigationItem.leftBarButtonItem = barButton
                    }

                } else {
                    btn.addTarget(self, action: #selector(self.btnRightNavigationClicked), for: UIControl.Event.touchUpInside)
                    btn.tintColor = tintColor
                    if let tabBar = self.tabBarController {
                        tabBar.navigationItem.rightBarButtonItem = barButton
                    } else {
                        self.navigationItem.rightBarButtonItem = barButton
                    }
                }
            }
        }

Right button action

@objc func btnRightNavigationClicked(sender: UIButton) { 
   // add your logic here         
}

Left button action

@objc func btnLeftNavigationClicked(sender: UIButton) {
        guard let navigationController = self.navigationController else {
            return
        }
        navigationController.popViewController(animated: true)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.