Изображение для кнопки навигационной кнопки swift
Я хочу показать изображение в левой части моей навигационной панели в swift.
Я попытался добавить элемент кнопки навигационной панели и установить там изображение.
Проблема в том, что я должен использовать очень маленькое изображение, чтобы оно хорошо вписывалось в панель навигации. Но создание такого маленького изображения приводит к пикселизации, особенно на большом телефоне iPhone 6 и 6 Plus.
Есть ли способ использовать изображение хорошего качества, а затем установить рамку в соответствии с границами панели навигации?
Моя попытка:
var image = UIImage(named: "Harp.png")
image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
self.navigationItem.leftBarButtonItem.frame = CGRectMake(0, 0, 53, 31)
//image.frame = CGRectMake(0, 0, 53, 31)
Я попытался сначала поместить рамку на изображение, а затем на элемент кнопки панели.
Но это вызывает ошибку:
Тип выражения неоднозначен без дополнительного контекста.
Ответы
Ответ 1
Попробуйте это
let button = UIButton(type: UIButtonType.Custom)
button.setImage(UIImage(named: "yourImageName.png"), forState: UIControlState.Normal)
button.addTarget(self, action:Selector("callMethod"), forControlEvents: UIControlEvents.TouchDragInside)
button.frame=CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)
self.navigationItem.leftBarButtonItems = [newBackButton,barButton]
Для Swift 3
let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named: "yourImageName.png"), for: UIControlState.normal)
button.addTarget(self, action:#selector(ViewController.callMethod), for:.touchUpInside)
button.frame = CGRect.init(x: 0, y: 0, width: 30, height: 30) //CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem.init(customView: button)
self.navigationItem.leftBarButtonItem = barButton
Вот действие
func callMethod() {
//do stuff here
}
Ответ 2
Используйте этот код:
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]()
Ответ 3
Существует способ использовать изображения разных размеров, в зависимости от устройства. Он назывался Каталогом активов. Возможно, у вас уже есть один в вашем проекте, или если нет, вы можете добавить его с помощью File > New > File > Resource > Asset Catalogue
.
В вашем каталоге активов вы можете иметь несколько "Наборы изображений" (они будут показаны слева). Добавьте новый набор изображений с символом "+" внизу. Для каждого набора изображений вы можете предоставлять различные изображения (например, разных размеров) для каждого из @1x, @2x и @3x.
Затем, чтобы использовать одно из этих изображений в коде, просто используйте UIImage(named: "name_of_image_set")
- не указывайте расширение. Правильное изображение будет загружено в зависимости от устройства.
Надеюсь, это поможет!
Ответ 4
Свифт 4 и 5:
let imageView = UIImageView(image: UIImage(named: "Harp"))
let buttonItem = UIBarButtonItem(customView: imageView)
self.navigationItem.leftBarButtonItem = buttonItem