프로그래밍 방식으로 탐색 모음의 UIBarButtonItem?


135

나는이 솔루션을 잠시 동안 찾고 있었지만 아무것도 얻지 못했습니다. 예를 들어 하나의 솔루션은

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

이 코드는 "중지"이미지가있는 버튼을 추가합니다. 이와 같이 "검색,"새로 고침 "등의 다른 솔루션이 있습니다. 그러나 원하는 이미지로 프로그래밍 방식으로 단추를 추가하려면 어떻게해야합니까?

답변:


342

버튼 프레임을 설정하지 않은 사용자 정의 버튼 이미지 :

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을 확인하십시오 . 참고


버튼 프레임을 사용하여 사용자 정의 버튼 이미지가있는 UIBarButtonItem

에 대한 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이상

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 :) 를 사용하십시오.

 let rightBarButton = UIBarButtonItem(customView: btnName)
 self.navigationItem.rightBarButtonItem = rightBarButton

시스템 UIBarButtonItem의 경우

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

1 개 이상의 항목을 설정하려면 rightBarButtonItems왼쪽을 사용하십시오.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]

setLeftBarButtonItem또는 사용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);

신속한> = 2.2의 경우 동작은 #selector(Class.MethodName)...btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)


좋은 대답입니다. Selector 메소드가 다음과 같이 업데이트되었다는 점을 지적하고자합니다.let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
CodeBender

버튼에 텍스트를 포함하려면 CGRect 부분을 지정해야한다는 것을 알았습니다. 이것을 지정하지 않는 SO 주위에 떠있는 몇 가지 예가 있습니다.
Micah Montoya

완벽한 답변 주셔서 감사합니다. 스위프트 4에 대한 업데이트를 추가하는 것은 나쁘지 않습니다.
Milad Faridnia

38

Swift 4또는로 훨씬 쉽습니다Swift 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

UIBarButtonItemcustomView로 설정 하기 만하면됩니다

예를 들면 다음과 같습니다.

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

또는 사용 setFunction:

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

1
귀하의 코드가 잘 작동함에 따라 귀하의 답변을 투표 할 예정이지만 Bhavin의 코드는 원샷 솔루션이므로 그의 답변을 수락하겠습니다. 당신의 공헌에 감사합니다 :)
Rahul Sonvane

11

방금이 질문을 우연히 발견했으며 다음은 Swift 3 및 iOS 10에 대한 업데이트입니다.

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

모든 속성으로 UIButton을 만든 다음 UIBarButtonItem에 customView를 추가하는 것보다 훨씬 빠릅니다.

또한 이미지의 색상을 기본 파란색에서 흰색으로 변경하려면 항상 색조 색상을 변경할 수 있습니다.

test.tintColor = UIColor.white()

추신 : 당신은 분명히 앱의 선택기 등을 변경해야합니다 :)


7

Swift 3.0 이상에서는 UIBarButtonItem다음과 같이 프로그래밍 방식으로 설정됩니다.

   override func viewDidLoad() {
        super.viewDidLoad()
        let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(self.clickButton))
        self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    }

   @objc func clickButton(){
            print("button click")
     }

3

원본 이미지로 LeftBarButton 설정.

let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
self.navigationItem.leftBarButtonItem  = menuButton

2

나는 같은 문제가 있고 다른 주제에서 답을 읽은 다음 다른 비슷한 방법으로 해결합니다. 어느 것이 더 효과적인지 모르겠습니다. 비슷한 문제

//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 );
}

1

이것은 사과의 미친 것입니다. self.navigationItem.rightBarButtonItem.title을 말하면 GUI에 nil이 표시되고 편집 또는 저장이 표시됩니다. 이 행동을 디버깅하는 데 많은 시간이 걸릴 것입니다.

항목에 firt load에서 Edit가 표시되어야하고 사용자가 탭해야한다는 제목이 필요합니다. 제목 저장으로 변경됩니다. 이것을 보관하기 위해 다음과 같이했습니다.

//보기로드로 제목 수정이 표시됩니다.

private func loadRightBarItem() {
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
}

// 항목 수정을 탭하면 제목 저장으로 변경됩니다.

@objc private func handleEditBtn() {
    print("clicked on Edit btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(handleSaveBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
    blockEditTable(isBlock: false)
}

// 항목 저장을 누르면 제목 편집이 표시됩니다.

@objc private func handleSaveBtn(){
    print("clicked on Save btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

    saveInvitation()
    blockEditTable(isBlock: true)

}

1

iOS 11

제약 조건을 사용하여 사용자 정의 버튼 설정 :

let buttonWidth = CGFloat(30)
let buttonHeight = CGFloat(30)

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "img name"), for: .normal)
button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
button.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: button)

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)
}

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.