2014-12-16 4 views
30

Я пытаюсь установить изображение для кнопки бара Пункта для этого у меня есть изображение, как:Как установить изображение для кнопки со стрелкой?

enter image description here

с разрешением 30 * 30, но пока я задаю это изображение кнопки заблокируйте его выглядит следующим образом:

enter image description here

Я назначили изображение таким образом:

enter image description here

и если я пытаюсь так как сделав IBOutlet для кнопки и установить изображение программно сформировать this вопрос и код, который:

// Outlet for bar button 
@IBOutlet weak var fbButton: UIBarButtonItem! 

// Set Image for bar button 
var backImg: UIImage = UIImage(named: "fb.png")! 
fbButton.setBackgroundImage(backImg, forState: .Normal, barMetrics: .Default) 

, но ничего не случилось с этим,

Может кто-нибудь сказать мне, что я делаю неправильно?

или который является способом измельчения для этого?

ответ

48

я добился того, что программно с этим кодом:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //create a new button 
     let button: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton 
     //set image for button 
     button.setImage(UIImage(named: "fb.png"), forState: UIControlState.Normal) 
     //add function for button 
     button.addTarget(self, action: "fbButtonPressed", forControlEvents: UIControlEvents.TouchUpInside) 
     //set frame 
     button.frame = CGRectMake(0, 0, 53, 31) 

     let barButton = UIBarButtonItem(customView: button) 
     //assign button to navigationbar 
     self.navigationItem.rightBarButtonItem = barButton 
    } 

    //This method will call when you press button. 
    func fbButtonPressed() { 

     println("Share to fb") 
    } 
} 

И результат будет:

enter image description here

Таким же образом вы кнопку для левой стороны можно установить слишком это путь:

self.navigationItem.leftBarButtonItem = barButton 

И результат будет:

enter image description here

И если вы хотите такое же операцию, как навигационный контроллер есть, когда вы возвращаетесь с кнопкой по умолчанию обратно, то вы можете добиться того, что с пользовательской задней кнопкой с этим кодом:

func backButtonPressed(sender:UIButton) { 
    navigationController?.popViewControllerAnimated(true) 
} 

Для быстрого 3.0:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //create a new button 
     let button = UIButton.init(type: .custom) 
     //set image for button 
     button.setImage(UIImage(named: "fb.png"), for: UIControlState.normal) 
     //add function for button 
     button.addTarget(self, action: #selector(ViewController.fbButtonPressed), for: UIControlEvents.touchUpInside) 
     //set frame 
     button.frame = CGRect(x: 0, y: 0, width: 53, height: 51) 

     let barButton = UIBarButtonItem(customView: button) 
     //assign button to navigationbar 
     self.navigationItem.rightBarButtonItem = barButton 
    } 

    //This method will call when you press button. 
    func fbButtonPressed() { 

     print("Share to fb") 
    } 
} 
+7

Отличное решение. Я не думаю, что вам нужно использовать это как кнопку UIButton 'let: UIButton = UIButton.buttonWithType (UIButtonType.Custom) как! UIButton' На самом деле, в Swift 2.1 у нас есть следующее: 'let button: UIButton = UIButton (тип: UIButtonType.Custom)' –

+0

Для быстрой версии 4 вам нужно также добавить привязки ограничения ширины и высоты к кнопке 'button' s и установите его 'translatesAutoresizingMaskIntoConstraints' как false. например. 'button.widthAnchor.constriant (equalToConstant: 53) .isActive = true' ' button.heightAnchor.constraint (equalToConstant: 51).isActive = true' – kbunarjo

4

Ваша проблема в том, что на пути значок был сделан - он не соответствует пользовательской панели вкладок значок спецификации Apple:

To design a custom bar icon, follow these guidelines: 

Use pure white with appropriate alpha transparency. 
Don’t include a drop shadow. 
Use antialiasing. 

Из принципов:

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/BarIcons.html#//apple_ref/doc/uid/TP40006556-CH21-SW1

То, что было бы возможно, выглядит так. Вы можете найти такие значки на большинстве бесплатных сайтов значков на вкладке.

enter image description here

+0

спасибо за ответ и вы можете дать мне любой сайт, на котором я могу скачать такие изображения? –

+0

Я получил один выше от http://www.icondeposit.com/theicondeposit:139 – aparna

14

Аналогично принятому решению, но вы можете заменить

let button: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton 

с

let button = UIButton() 

Вот полное решение, наслаждайтесь: (это просто немного чище, чем принятое решение)

let button = UIButton() 
button.frame = CGRectMake(0, 0, 51, 31) //won't work if you don't set frame 
button.setImage(UIImage(named: "fb"), forState: .Normal) 
button.addTarget(self, action: Selector("fbButtonPressed"), forControlEvents: .TouchUpInside) 

let barButton = UIBarButtonItem() 
barButton.customView = button 
self.navigationItem.rightBarButtonItem = barButton 
+0

добавить двоеточие в конце fbButtonPressed –

+0

@AbdulWaheed это неверно, потому что он не принимает никаких аргументов. – jungledev

+1

Ты потрясающий гейди! –

8

Я использую последнюю скорость (2.1), и ответ (Dharmesh Kheni and jungledev) не работает для меня. Цвет изображения был выключен (при установке в IB он был синим, а при настройке непосредственно в UIButton он был черным). Оказывается, я мог бы создать один и тот же пункт бар со следующим кодом:

let barButton = UIBarButtonItem(image: UIImage(named: "menu"), landscapeImagePhone: nil, style: .Done, target: self, action: #selector(revealBackClicked)) 
self.navigationItem.leftBarButtonItem = barButton 
+0

Это должно быть принято отвечать – stumped

10

Вот простой extension на UIBarButtonItem:

extension UIBarButtonItem { 
    class func itemWith(colorfulImage: UIImage?, target: AnyObject, action: Selector) -> UIBarButtonItem { 
     let button = UIButton(type: .custom) 
     button.setImage(colorfulImage, for: .normal) 
     button.frame = CGRect(x: 0.0, y: 0.0, width: 44.0, height: 44.0) 
     button.addTarget(target, action: action, for: .touchUpInside) 

     let barButtonItem = UIBarButtonItem(customView: button) 
     return barButtonItem 
    } 
} 
+0

Для быстрой 4, вам нужно также добавить привязки ограничения ширины и высоты к кнопке 'button' и установить его' translatesAutoresizingMaskIntoConstraints' как false. например. 'button.widthAnchor.constriant (equalToConstant: 44) .isActive = true' ' button.heightAnchor.constraint (equalToConstant: 44) .isActive = true' – kbunarjo

15

Простое решение может быть следующим

barButtonItem.image = UIImage(named: "image") 

затем перейдите на вкладку Assets.xcassets, выберите изображение и перейдите к инспектору атрибутов и выберите «Исходное изображение» в списке «Повторить».

+0

Иногда ответ проще, чем мы думаем. Ранее я создал новый UIBarButtonItem, который инициализирован с изображением, которое я пытался изменить, и назначил его текущему UIBarButtonItem. Видимо, вам этого не нужно. Просто установите его свойство изображения текущего UIBarButtonItem на изображение, которое я пытался изменить. ♂️. Благодаря! – yohannes

+0

Кроме того, если изображение не находится в каталоге активов, вы можете использовать расширение UIImage .withRenderingMode (.alwaysOriginal) для достижения того же. UIImage (названный: «образ»). WithRenderingMode (.alwaysOriginal) – Mike

3

только две строки кода, требуемого для этого

Swift 3.0

let closeButtonImage = UIImage(named: "ic_close_white") 
     navigationItem.rightBarButtonItem = UIBarButtonItem(image: closeButtonImage, style: .plain, target: self, action: #selector(ResetPasswordViewController.barButtonDidTap(_:))) 

func barButtonDidTap(_ sender: UIBarButtonItem) 
{ 

} 
+0

Спасибо! Он короткий и сладкий. – Raja

+0

Также работал с Swift 4. – Alfi

+0

Он работает, но цвет изображения изменился .... – Jerome

0

Если UIBarButtonItem уже выделен, как в раскадровке. (printBtn)

let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30)) 
    btn.setImage(UIImage(named: Constants.ImageName.print)?.withRenderingMode(.alwaysTemplate), for: .normal) 
    btn.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handlePrintPress(tapGesture:)))) 
    printBtn.customView = btn 
-1

Не забудьте имя изображения CaseSensitive для XCode.

+0

Это не ответ на вопрос –

1

Вы можете использовать этот код для кнопки многократного бара с пользовательским изображением:

self.navigationItem.leftBarButtonItem = nil 

let button = UIButton(type: .custom) 
button.setImage(UIImage (named: "ChatTab"), for: .normal) 
button.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0) 
//button.addTarget(target, action: nil, for: .touchUpInside) 
let barButtonItem = UIBarButtonItem(customView: button) 

let button2 = UIButton(type: .custom) 
button2.setImage(UIImage (named: "ActivityTab"), for: .normal) 
button2.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0) 
//button.addTarget(target, action: nil, for: .touchUpInside) 

let barButtonItem2 = UIBarButtonItem(customView: button2) 
self.navigationItem.rightBarButtonItems = [barButtonItem, barButtonItem2] 

Результатом будет такое:

enter image description here

Смежные вопросы