#ios #swift #uinavigationbar #rightbarbuttonitem
#iOS #swift #панель uinavigationbar #rightbarbuttonitem
Вопрос:
Я пытался разместить hamburger
кнопку (три параллельные линии) справа от titleView
на панели навигации, но каждый раз, когда я это делаю, изображение, которое я вставляю, покрывает всю панель навигации и удаляет изображение, которое у меня есть titleView
.
Если я выберу изображение по умолчанию в редакторе раскадровки, оно появится в правой части панели навигации без каких-либо проблем, но как только я выбираю кнопку гамбургера в редакторе раскадровки, я получаю ту же проблему, что и раньше. Я пробовал использовать несколько разных изображений и немного изменил код, но безуспешно. Есть ли способ изменить размер изображения, которое я использую, чтобы оно правильно помещалось на панели навигации, или просто что-то не так с моим кодом?
Вот мой код из viewController.swift
приведенного ниже:
override func viewDidAppear(_ animated: Bool) {
let nav = self.navigationController?.navigationBar
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
imageView.contentMode = .scaleAspectFit
let titleImage = UIImage(named: "logowhitecircle")
imageView.image = titleImage
navigationItem.titleView = imageView
let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
menuButton.contentMode = .scaleAspectFit
let menuImage = UIImage(named: "hamburgericon")
menuButton.setImage(menuImage, for: .normal)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: menuButton)
Комментарии:
1. Есть ли у вас
hamburgericon.png
с@2x
и@3x
версиями все в правильном размере дляUIBarButtonItem
? И зачем использоватьUIButton
? Просто используйтеUIBarButtonItem
инициализатор, который принимает изображение.2. Проблема в том, что вы не установили никаких ограничений на ширину и высоту автозапуска для вашей кнопки.
Ответ №1:
Вам нужно установить размер изображения в ресурсах изображения, например, 3x = 84px, 2x = 56px, 1x = 28px,
смотрите документ Apple для получения дополнительной информации:https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/custom-icons
let menuButton = UIBarButtonItem(image: UIImage(named: "logowhitecircle"), style: .plain, target: self, action: #selector(menuButtonTapped(_:)))
self.navigationItem.rightBarButtonItem = menuBu
tton
Ответ №2:
Попробуйте использовать приведенный ниже код:
let imageBurger = UIImage(named: "hamburgericon")!
let btnLeftMenu = UIButton(type: .system)
btnLeftMenu.bounds = CGRect(x: 10, y: 0, width: imageBurger.size.width, height: imageBurger.size.height)
btnLeftMenu.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
btnLeftMenu.setImage(imageBurger, for: UIControl.State())
btnLeftMenu.setTitle(title, for: .normal)
let leftButton = UIBarButtonItem(customView: btnLeftMenu)
self.navigationItem.leftBarButtonItem = leftButton
Ответ №3:
Попробуйте этот модуль FFBadgedBarButtonItem это простой в использовании модуль, вот ссылка на документацию
Ниже приведен мой код, как это реализовать!
let image = UIImage(named: "yourImage")
let finalImage = resizeImage(image: image!, newWidth: 30)
navigationItem.rightBarButtonItem = FFBadgedBarButtonItem(image: finalImage, target: self, action: #selector(rightButtonTouched))
И вот вызывающая функция
@objc func rightButtonTouched() {
// what event you need to perfom by clicking on this button
}
Для работы с этим модулем Obj-C необходимо создать соединительный заголовок.
: D
Ответ №4:
Попробуйте это:
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: "hamburgericon"), forState: UIControlState.Normal)
//add function for button
button.addTarget(self, action: "customButtonPressed", forControlEvents: UIControlEvents.TouchUpInside)
//set frame
button.frame = CGRectMake(0, 0, 40, 40)
let barButton = UIBarButtonItem(customView: button)
//assign button to navigationbar
self.navigationItem.rightBarButtonItem = barButton
}
//This method will call when you press button.
func customButtonPressed() {
println("button pressed")
}
}