Быстрое пользовательское изображение NavBar Back Button и текст

Мне нужно настроить внешний вид кнопки в проекте Swift.

Вот что у меня есть: Default Back Button

Вот что я хочу: Custom Back Button

Я попытался создать свой собственный UIBarButtonItem, но я не могу понять, как получить изображение рядом с текстом, а не как фон или замену текста.

let backButton = UIBarButtonItem(title: "Custom", style: .Plain, target: self, action: nil    )
//backButton.image = UIImage(named: "imageName") //Replaces title
backButton.setBackgroundImage(UIImage(named: "imageName"), forState: .Normal, barMetrics: .Default) // Stretches image
navigationItem.setLeftBarButtonItem(backButton, animated: false)

Ответы

Ответ 1

Вы можете сделать что-то вроде этого:

let yourBackImage = UIImage(named: "back_button_image")
self.navigationController?.navigationBar.backIndicatorImage = yourBackImage
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
self.navigationController?.navigationBar.backItem?.title = "Custom"

У вашего изображения будет только один цвет, хотя

Ответ 2

Примечание. Помните, что кнопка "Назад" относится к исходному ViewController, а не к целевому ViewController. Таким образом, модификация должна быть выполнена в исходном VC, что отражается на всем представлении в навигационном контроллере

Фрагмент кода:

let backImage = UIImage(named: "icon-back")

self.navigationController?.navigationBar.backIndicatorImage = backImage

self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backImage

/*** If needed Assign Title Here ***/
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil)

Ответ 3

swift 4

В моем случае мне нужно было только изображение кнопки без текста. Надеюсь, это кому-то будет полезно.

let imgBackArrow = UIImage(named: "back_arrow_32")

navigationController?.navigationBar.backIndicatorImage = imgBackArrow
navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBackArrow

navigationItem.leftItemsSupplementBackButton = true
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

Ответ 4

Наличие кнопки в панели навигации с изображением и текстом довольно сложно. Особенно после того, как они ввели новую головную боль с позицией UIBarButtonItem в iOS 11: iOS 11 - UIBarButtonItem горизонтальная позиция

Вы можете сделать любую кнопку с изображением или кнопкой с текстом, но не с кнопкой с обоими из них. Я даже попробовал два UIBarButtonItems вместе, один с изображением и другой с текстом - он все еще не выглядит хорошо, и их UIStackView не может быть легко доступен для модификации.

Неожиданно я нашел простое решение:

1) спроектируйте кнопку в виде интерфейса в Interface Builder. В моем случае он находится внутри целевого UIViewController и доступен через IBOutlet для простоты

2) установите ограничение ведущего пространства для негативного изображения, вы также можете установить цвет фона представления для.clear.

enter image description here

3) использовать его:

@IBOutlet var backButtonView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    let backButton = UIBarButtonItem(customView: self.backButtonView)
    self.backButtonView.heightAnchor.constraint(equalToConstant: 44).isActive = true // if you set more than you'll get "Unable to simultaneously..."
    self.backButtonView.widthAnchor.constraint(equalToConstant: 75).isActive = true
    self.navigationItem.leftBarButtonItem = backButton
}

Это. Не нужно использовать трюк с отрицательным разделителем для iOS 10 или трюк с imageInsets для iOS 11 (который работает, только если у вас есть изображение и не работает для изображения + текст, BTW).

enter image description here

Ответ 5

Для изображения кнопки "Назад":

  • В этом уроке: (но не работал для меня)

    UINavigationBar.appearance().backIndicatorImage = UIImage(named: "imageName")
    
  • Но ответ на этот стек: (работал для меня)

    var backButtonImage = UIImage(named: "back-button-image")
    backButtonImage = backButtonImage?.stretchableImage(withLeftCapWidth: 15, topCapHeight: 30)
    UIBarButtonItem.appearance().setBackButtonBackgroundImage(backButtonImage, for: .normal, barMetrics: .default)
    

И для шрифта, если вы хотите, чтобы шрифт соответствовал всей навигационной панели: (в настоящее время используется)

if let font = UIFont(name: "Avenir-Book", size: 22) {
  UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: font]
}

Ответ 6

swift 3

    extension UIViewController {

        func setBackButton(){
            let yourBackImage = UIImage(named: "backbutton")
            navigationController?.navigationBar.backIndicatorImage = yourBackImage
            navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        }

    }

Ответ 7

Просто замените backButton на пользовательский rightBarButtonItem

let backImage = UIImage(named: "BackBtn")?.withRenderingMode(.alwaysOriginal)
    navigationItem.leftBarButtonItem = UIBarButtonItem(image: backImage, style: .plain, target: self, action: #selector(popnav))

    @objc func popnav() {
    self.navigationController?.popViewController(animated: true)
}