首页 文章

以编程方式在导航栏中的UIBarButtonItem?

提问于
浏览
93

我一直在寻找这个解决方案一段时间但没有得到任何解决方案 . 例如,一种解决方案

self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)

此代码将添加一个带有"stop"图像的按钮 . 就像这样,还有其他解决方案"search, "刷新“等等_但是 what if I want to add a button programmatically with the image I want?

8 回答

  • 2

    Custom button image without setting button frame:

    您可以使用 init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?) 使用指定的图像和其他属性初始化新项目 .

    let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
    self.navigationItem.rightBarButtonItem  = button1
    

    检查一下Apple Doc. reference


    UIBarButtonItem使用按钮框架自定义按钮图像

    FOR Swift 3.0

    let btn1 = UIButton(type: .custom)
        btn1.setImage(UIImage(named: "imagename"), for: .normal)
        btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside)
        let item1 = UIBarButtonItem(customView: btn1)
    
        let btn2 = UIButton(type: .custom)
        btn2.setImage(UIImage(named: "imagename"), for: .normal)
        btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside)
        let item2 = UIBarButtonItem(customView: btn2)  
    
        self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)
    

    FOR Swift 2.0 and older

    let btnName = UIButton()
    btnName.setImage(UIImage(named: "imagename"), forState: .Normal)
    btnName.frame = CGRectMake(0, 0, 30, 30)
    btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside)
    
    //.... Set Right/Left Bar Button item
    let rightBarButton = UIBarButtonItem()
    rightBarButton.customView = btnName
    self.navigationItem.rightBarButtonItem = rightBarButton
    

    或者只是使用init(customView :)就像让右边的BarButton = UIBarButtonItem(customView:btnName)
    self.navigationItem.rightBarButtonItem = rightBarButton


    For System UIBarButtonItem

    let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
    self.navigationItem.rightBarButtonItem = camera
    

    For set more then 1 items use rightBarButtonItems or for left side leftBarButtonItems

    let btn1 = UIButton()
    btn1.setImage(UIImage(named: "img1"), forState: .Normal)
    btn1.frame = CGRectMake(0, 0, 30, 30)
    btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
    let item1 = UIBarButtonItem()
    item1.customView = btn1
    
    let btn2 = UIButton()
    btn2.setImage(UIImage(named: "img2"), forState: .Normal)
    btn2.frame = CGRectMake(0, 0, 30, 30)
    btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside)
    let item2 = UIBarButtonItem()
    item2.customView = btn2
    
    self.navigationItem.rightBarButtonItems = [item1,item2]
    

    Using setLeftBarButtonItem or setRightBarButtonItem

    let btn1 = UIButton()
    btn1.setImage(UIImage(named: "img1"), forState: .Normal)
    btn1.frame = CGRectMake(0, 0, 30, 30)
    btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
    self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);
    

    对于swift> = 2.2,动作应该是#selector(Class.MethodName)...例如btnName.addTarget(self,action:#selector(Class.MethodName),forControlEvents:.TouchUpInside)

  • 8

    只需使用customView设置 UIBarButtonItem 即可

    例如:

    var leftNavBarButton = UIBarButtonItem(customView:yourButton)
      self.navigationItem.leftBarButtonItem = leftNavBarButton
    

    或使用 setFunction

    self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);
    
  • 4

    我只是偶然发现了这个问题,这里是Swift 3和iOS 10的更新:

    let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
    self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    

    它肯定比使用所有属性创建UIButton然后随后将customView添加到UIBarButtonItem快得多 .

    如果你想将图像的颜色从默认的蓝色更改为例如白色,您可以随时更改色调颜色:

    test.tintColor = UIColor.white()
    

    PS你显然应该改变你的应用程序的选择器等:)

  • 284

    Swift 4Swift 4.2 更容易

    ViewDidLoad 方法中,定义您的按钮并将其添加到导航栏 .

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
        self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
    
    }
    

    那么你需要定义你在action参数中提到的函数,如下所示

    @objc func logoutUser(){
         print("clicked")
    }
    

    您需要添加 @objc 前缀,因为它仍在使用遗留内容(目标C) .

  • 17

    在快捷方式3中,在按钮中执行操作:

    let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(ViewController.clickButton))
    self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    
    func clickButton(){
            print("button click")
        }
    
  • 2

    我有同样的问题,我已经阅读了另一个主题的答案,然后我解决了另一个类似的方式 . 我不知道哪个更有效 . similar issue

    //play button
    
    @IBAction func startIt(sender: AnyObject) {
        startThrough();
    };
    
    //play button
    
    func startThrough() {
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true);
    
        let pauseButton = UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "pauseIt");
        self.toolBarIt.items?.removeLast();
        self.toolBarIt.items?.append( pauseButton );
    }
    
    func pauseIt() {
        timer.invalidate();
    
        let play = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "startThrough");
        self.toolBarIt.items?.removeLast();
        self.toolBarIt.items?.append( play );
    }
    
  • 11

    使用原始图像设置LeftBarButton .

    let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
    self.navigationItem.leftBarButtonItem  = menuButton
    
  • 0
    func viewDidLoad(){
    let homeBtn: UIButton = UIButton(type: UIButtonType.custom)
    
            homeBtn.setImage(UIImage(named: "Home.png"), for: [])
    
            homeBtn.addTarget(self, action: #selector(homeAction), for: UIControlEvents.touchUpInside)
    
            homeBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    
            let homeButton = UIBarButtonItem(customView: homeBtn)
    
    
            let backBtn: UIButton = UIButton(type: UIButtonType.custom)
    
            backBtn.setImage(UIImage(named: "back.png"), for: [])
    
            backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside)
    
            backBtn.frame = CGRect(x: -10, y: 0, width: 30, height: 30)
    
            let backButton = UIBarButtonItem(customView: backBtn)
            self.navigationItem.setLeftBarButtonItems([backButton,homeButton], animated: true)
    }
    
    }
    

相关问题