Swiftプロジェクトの戻るボタンの外観をカスタマイズする必要があります。
独自の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)
次のようなことができます:
let yourBackImage = UIImage(named: "back_button_image")
self.navigationController?.navigationBar.backIndicatorImage = yourBackImage
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
self.navigationController?.navigationBar.backItem?.title = "Custom"
ただし、画像には1色しかありません
注:戻るボタンは、宛先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)
スイフト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)
}
戻るボタンの画像の場合:
これにより チュートリアル :(しかし、私にとってはうまくいきませんでした)
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]
}
ナビゲーションバーにボタンを画像とテキストで表示するのは非常に困難です。特に、iOS 11でUIBarButtonItemの位置に関する新しい頭痛の種を導入した後: iOS 11-UIBarButtonItem horizontal position
画像付きボタンまたはテキスト付きボタンのいずれかを作成できますが、両方のボタンは作成できません。私は2つのUIBarButtonItemsを一緒に試しました。1つは画像を使用し、もう1つはテキストを使用しました。まだ見栄えが悪く、UIStackViewに簡単にアクセスして変更することはできません。
意外と単純な解決策を見つけました。
1)Interface Builderでビューとしてボタンを設計します。私の場合、ターゲットUIViewController内にあり、簡単にするためにIBOutlet経由でアクセスできます
2)画像のリーディングスペース制約を負に設定します。ビューの背景色を.clearに設定することもできます。
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では機能しない場合にのみ機能します)。
スイフト3
extension UIViewController {
func setBackButton(){
let yourBackImage = UIImage(named: "backbutton")
navigationController?.navigationBar.backIndicatorImage = yourBackImage
navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
}
}
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)
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)
}