2016-05-31 4 views
18

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

Вот что у меня есть: 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) 
+0

@Randy Вы имеете в виду сделать UIView и добавить ярлык и ImageView и установить, что? – Conor

ответ

31

Вы можете сделать что-то подобное:

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

Ваше изображение будет иметь уникальный цвет, хотя

+1

В основном работал, название кнопки не изменилось. пусть yourBackImage = UIImage (с именем: "back_button_image") self.navigationController .navigationBar.backIndicatorImage = yourBackImage self.navigationController .navigationBar.backIndicatorTransitionMaskImage = yourBackImage self.navigationController .navigationBar.backItem .title = "?? Пользовательский « – Conor

+0

Моя кнопка« Назад »заканчивается в центре экрана? Есть предположения? –

4

Для кнопки обратно изображения:

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

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

    let backButtonImage = UIImage(named: "back-button-image") 
    backButtonImage = backButtonImage?.stretchableImageWithLeftCapWidth(15, topCapHeight: 30) 
    UIBarButtonItem.appearance().setBackButtonBackgroundImage(backButtonImage, forState: .Normal, barMetrics: .Default) 
    

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

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

Примечание: Пожалуйста, помните, что кнопки назад б возвращается к исходному 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) 
+0

это работает, НО, как установить рамку изображения. Только с этим кодом все изображение выходит за рамки. – Annjawn

+0

@ Изображение Annjawn можно исправить следующим образом: UIImage (named: «icon-back») ?. stretchableImage (withLeftCapWidth: 15, topCapHeight: 30), как показано в ответе Идана ниже – Vitalii

2

быстрой 3

extension UIViewController { 

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

    } 
1

быстрое 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) 
1

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

Вы можете сделать любую кнопку с изображением или кнопкой с текстом, но не с кнопкой с обоими из них. Я даже попробовал два 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: 45).isActive = true 
    self.backButtonView.widthAnchor.constraint(equalToConstant: 75).isActive = true 
    self.navigationItem.leftBarButtonItem = backButton 
} 

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

enter image description here