戻るボタンからテキストを削除したいのですが、アイコンは残したいのですが。私が試してみました
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
ただし、これによりテキストとアイコンは完全に削除されます。
戻るボタンからテキストを削除したいのですが、アイコンは残したいのですが。私が試してみました
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
ただし、これによりテキストとアイコンは完全に削除されます。
回答:
私はこれがすでに答えを持っていることを知っていますが、コードでそれを行うこともできます(nibsで作業している場合)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
上記を最初のView Controllerに追加します。
プッシュしているビューコントローラーごとにこれを行う必要があることに注意してください。したがって、3つのビューコントローラーがあり、それらすべてからバックテキストを削除する場合は、ビューコントローラー1と2に行を追加する必要があります。
.Plain
に変更されました.plain
。資本金なし
多くを検索した後、私は最善かつ簡単な解決策を見つけました、これはSwift 4.2で記述され、Swift 5でも機能するすべてのviewControllersに影響します
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
戻るボタンのテキストは、マスタービューのタイトルによって異なります。
トリックは、マスタービューが消えた場合はタイトルをクリアし、再度表示された場合は再度設定することです。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// needed to clear the text in the back navigation:
self.navigationItem.title = " "
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "My Title"
}
プッシュされたビューコントローラーから戻るボタンのタイトルを削除したい場合は、subSettingsViewControllerで次のように言っ<Settings
て<
ください。それから、SettingsViewControllerのviewWillDisappear()メソッドでbackBarButtonItemタイトルを設定する必要があります。
Objective-C:
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}
迅速:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
.Plain
に変更されました.plain
。資本金なし
戻る矢印が必要な場合は、次のコードをAppDelegateファイルに追加し、didFinishLaunchingWithOptionsメソッドに追加します。
Swiftの場合
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
私の場合、カスタムアイコンとタイトルの場合、これでうまくいきました(Swift 4)
let imgBack = UIImage(named: "ic_back")
navigationController?.navigationBar.backIndicatorImage = imgBack
navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack
navigationItem.leftItemsSupplementBackButton = true
navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)
ついに完璧なソリューションが見つかりました。
透明な画像を1つ追加し、AppDelegateに次のコードを追加するだけです。
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment
他のほとんどの回答がお勧めするハックを使用していましたが、長いタイトルのビューコントローラーのiPhone Xでは壊れていました。このソリューションは問題なく機能します。
迅速に4
self.navigationController?.navigationBar.topItem?.title = ""
スウィフト4+ にこれらの行を入れるAppDelegate
時didFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
ViewControllerAがあり、ViewControllerBに移動する場合は、ViewControllerAで、新しいUIBarButtonItemを使用して現在のnavigationItemを設定し、別のビューコントローラーにプッシュする前にタイトルに空白の文字列を設定する必要があります。
タイトルを空白の文字列に設定します。デフォルト値はnilであるため、nilや ""(空の文字列)を設定することはできません
let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)
self.navigationItem.leftBarButtonItem = barButton
func backButtonPressed(btn : UIButton) {
// Your code
}
ナビゲーションコントローラースタックのすべてのビューコントローラーから削除するには:
UINavigationControllerをサブクラス化し、これを追加します。
override func show(_ vc: UIViewController, sender: Any?) {
setEmptyBackButton(vc)
super.show(vc, sender: sender)
}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
setEmptyBackButton(viewController)
super.pushViewController(viewController, animated: animated)
}
func setEmptyBackButton(_ viewController: UIViewController) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
タイトルが長い場合、タイトルの色だけを変更しても機能しないことがあります。ナビゲーションバーのタイトルが左に移動する可能性があるためです。したがって、これを防ぐには、バーボタンのタイトルを水平に移動するだけでなく、透明にする必要があります。
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
私にとってこれはトリックをしました:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
self.navigationItem.title = " "
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "my amazing title"
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
backBarButtonItem を変更せずにタイトルのみを設定すると、動作するように見えることに注意してください。ただし、ジェスチャーを使用して戻り、キャンセルしてプッシュされたビューコントローラーに留まると、バックタイトルが戻されます。
Swift 4での作業
コントローラのナビゲーションバーを選択して、[戻る]ボタンが指すFROMを選択し、[戻る]ボタンフィールドに「」と入力します。
たとえば、AコントローラーをBコントローラーにプッシュする場合は、Aコントローラーのナビゲーションバーに空白を入れます。
1. UINavigationControllerのカスタムクラスを作成する
import UIKit
class NavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}
extension NavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController.navigationItemBackButtonTextIsHidden {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
}
2. UIViewController拡張機能を追加する
import UIKit
extension UIViewController {
@objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}
3. ViewControllerクラスを更新します
import UIKit
class ViewController: UIViewController {
override var navigationItemBackButtonTextIsHidden: Bool { return true }
}
import UIKit
// MARK: - ViewController
class ViewController: UIViewController {
var screenCounter = 1
override func viewDidLoad() {
super.viewDidLoad()
setupNavigationItem()
}
override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}
extension ViewController {
private func setupNavigationItem() {
navigationItem.title = "VC \(screenCounter)"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
}
@objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
guard let navigationController = navigationController else { return }
let viewController = ViewController()
viewController.screenCounter = screenCounter + 1
viewController.view.backgroundColor = .white
navigationController.pushViewController(viewController, animated: true)
}
}
// MARK: - NavigationController
class NavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}
extension NavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController.navigationItemBackButtonTextIsHidden {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
}
// MARK: - UIViewController extension
extension UIViewController {
@objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}
ViewControllers
私のためにすべてをオーバーライドする1つの代替方法は、のを拡張UINavigationController
して設定することbackBarButtonItem
でしたtopViewController
。
Swift 5
Xcode 11.2.1の場合:
extension UINavigationController {
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let backButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
self.topViewController?.navigationItem.backBarButtonItem = backButton
}
}
これをプログラムで行う最も簡単な方法はbackBarButtonItem
、親のビューコントローラー(pushを呼び出すコントローラー)から設定することです。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backBarButtonItem
}
}
詳細はこちらhttps://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/
のデリゲートメソッドを使用して、戻るボタンからテキストを削除できますUINavigationController
。
class CustomNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
}
extension CustomNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
}
}
以前のビューコントローラーをまったく制御していない場合(つまり、フレームワークで作業している場合)、次のように[戻る]ボタンのタイトルを削除できます。
// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()
// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil
それが行うことは、ナビゲーションのスタックの最後の項目に移動し、そのバックタイトルを削除することです。ビューコントローラが表示されたら、必ず元のファイルを保存してください。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
// Delete title somewhere here...
}
そして、それを再割り当てし、アプリのどの部分も中断しないようにします。
override func viewWillDisappear(_ animated: Bool) {
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
super.viewWillDisappear(animated)
}
これはあなたの問題を解決します:
import UIKit
extension UINavigationController{
func customizeBackArrow(){
let yourBackImage = UIImage(named: "icon_back_arrow")
self.navigationBar.backIndicatorImage = yourBackImage
self.navigationBar.tintColor = Common.offBlackColor
self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
navigationItem.leftItemsSupplementBackButton = true
self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "",
style: .plain, target: self, action: nil)
}
}
不要な副作用のない簡単なプログラム的な方法は、ソースコントローラー(ナビゲート元のコントローラー)のawakeFromNibメソッドの空の項目で、navigationItem.backBarButtonItemを初期化することです。
override func awakeFromNib() {
super.awakeFromNib()
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
注:viewDidLoad()メソッドのように、後で戻るボタンを初期化した場合は、スワイプバックが失われます。機能ます(左端から右にスワイプすると、ナビゲーションスタックが1つ戻ります)。
次に、宛先コントローラーごとに異なる戻るボタンのテキストが必要で、セグエを使用している場合は、次のように、prepare(for segue :, sender :)メソッドでタイトルを設定できます。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let item = navigationItem.backBarButtonItem {
switch segue.identifier {
case "SceneOne": item.title = "Back"; break
case "SceneTwo": item.title = "Home"; break
case "SceneThree": item.title = nil; break // Use this scene's title
default: item.title = "" // No text
}
}
}