web-dev-qa-db-ja.com

SwiftカスタムNavBar戻るボタンの画像とテキスト

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)
38
Conor

次のようなことができます:

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

ただし、画像には1色しかありません

61
Randy

:戻るボタンは、宛先ViewControllerではなく、ソースViewControllerに属していることに注意してください。したがって、ソースVCで変更を行う必要があり、これはNavigation Controllerのすべてのビューに反映されます

コードスニペット:

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)
27

スイフト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)

IOS 12でできること

func setNavigationBar() {

    self.navigationItem.setHidesBackButton(true, animated:false)

    //your custom view for back image with custom size
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
    let imageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))

    if let imgBackArrow = UIImage(named: "icn_back_arrow") {
        imageView.image = imgBackArrow
    }
    view.addSubview(imageView)

    let backTap = UITapGestureRecognizer(target: self, action: #selector(backToMain))
    view?.addGestureRecognizer(backTap)

    let leftBarButtonItem = UIBarButtonItem(customView: view ?? UIView())
    self.navigationItem.leftBarButtonItem = leftBarButtonItem
}

@objc func backToMain() {
    self.navigationController?.popViewController(animated: true)
}
21
Booharin

戻るボタンの画像の場合:

  • これにより チュートリアル :(しかし、私にとってはうまくいきませんでした)

    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]
}
9
Idan

ナビゲーションバーにボタンを画像とテキストで表示するのは非常に困難です。特に、iOS 11でUIBarButtonItemの位置に関する新しい頭痛の種を導入した後: iOS 11-UIBarButtonItem horizo​​ntal position

画像付きボタンまたはテキスト付きボタンのいずれかを作成できますが、両方のボタンは作成できません。私は2つのUIBarButtonItemsを一緒に試しました。1つは画像を使用し、もう1つはテキストを使用しました。まだ見栄えが悪く、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のネガティブスペーサーを使用したトリックや、iOS 11のimageInsetsを使用したトリックを使用する必要はありません(イメージがあり、イメージ+テキスト、BTWでは機能しない場合にのみ機能します)。

enter image description here

9
Vitalii

スイフト3

    extension UIViewController {

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

    }
2
Ahmed Safadi

Swift 4.2この関数を追加ViewController

func addNavigationBarButton(imageName:String,direction:direction){
    var image = UIImage(named: imageName)
    image = image?.withRenderingMode(.alwaysOriginal)
    switch direction {
    case .left:
       self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
    case .right:
       self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
    }
}

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

enum direction {
    case right
    case left
}

使用するには、ここで使用する必要があります

viewDidLoad()

addNavigationBarButton(imageName: "ic_back", direction:.left)
1
ikbal

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)
}
1
Mohamed Ali