2016-05-31 224 views
18

我需要自定義Swift項目中後退按鈕的外觀。Swift自定義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

注意:請記住,後退按鈕b源於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(命名爲:「icon-back」)?stretchableImage(withLeftCapWidth:15,topCapHeight:30),如Idan的答案中所示 – 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

在帶有圖像和文字的導航欄中有一個按鈕非常困難。尤其是當他們在iOS 11中引入了UIBarButtonItem位置的新頭痛之後:iOS 11 - UIBarButtonItem horizontal position

您可以使用圖像或帶有文本的按鈕,但不使用帶有這兩種按鈕的按鈕。我甚至一起嘗試了兩個UIBarButtonItems,一個使用圖像,另一個使用文本 - 它仍然看起來不太好,並且它們的UIStackView無法輕鬆訪問以進行修改。

不料我發現了一個普通的簡單的解決方案:

1)設計按鈕視圖在界面生成器。在我的情況下,它是在目標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 for iOS 11的技巧(只有在您有圖像且不適用於圖像+文本時,才適用)。

enter image description here