UIViewController
を押すと、新しいUIViewController
の戻るボタンにタイトルがあります。タイトルに多くのテキストが含まれている場合、iPhone 4sでは見た目がよくないので削除します。
prepareForSegue
関数にコードを追加すると、問題が発生します。
これを達成するためのより良い方法はありますか?
戻る矢印が必要な場合は、次のコードをAppDelegate
ファイルに入れてdidFinishLaunchingWithOptions
メソッドに入れます。
For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
別のオプションを以下に示します。
Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
更新:
let BarButtonItemAppearance = UIBarButtonItem.appearance()
let attributes: [NSAttributedStringKey: Any] = [
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
PDATE Swift 4.1:
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
オフセットを使用
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
だからあなたの問題が解決されているかもしれません。
ハッピーコーディング。
Swift 3の仕事のような魅力
self.navigationController?.navigationBar.topItem?.title = " "
AppDelegate
ファイル内のこのコード行をdidFinishLaunchingWithOptions
メソッドに使用して、バックボタンtitle
を削除しています。
Swift 2.x
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)
Swift 3.x
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
Swift 4.x
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
他のViewControllerが依存している場所からParent ViewControllerに移動するだけです。
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
Xcode 8とSwift 3.0を使用できます
self.navigationController?.navigationBar.backItem?.title = " "
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
Swift 3.0でこのコード行を使用しました
この動作が必要なすべてのUIViewController
sおよびサブクラスのviewDidLoad
にサブクラスを作成できます。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(
title: "", style: .plain, target: nil, action: nil)
}
この方法により、コードを複製することなく、どのコントローラーにビヘイビアーを使用するかを選択できます。私のコントローラーは、前のコントローラーのタイトルではなく「戻る」と言う方が好きなので、ここでそのタイトルを設定します。
rordulu's answer here からインスピレーションを得て、このトリッキーな問題のすべてのケースを処理すると思われるカスタムUINavigationControllerとUINavigationバーを作成することになりました。
1)新しいUINavigationController
をカスタムUINavigationBar
で初期化します:
class CustomNavigationController: UINavigationController {
convenience init() {
self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
}
}
2)ビューがレイアウトされるたびに、ナビゲーションバーのbackItem.title
プロパティを空の文字列に設定します
class CustomNavigationBar: UINavigationBar {
override func layoutSubviews() {
backItem?.title = ""
super.layoutSubviews()
}
}
これで、このNavigation Controllerとバーの組み合わせを使用するたびに、戻るボタンのテキストが表示されなくなります! ????
注:ストーリーボードも使用する場合、これは正常に機能します。カスタムナビゲーションバーコンポーネントをビューにドロップするだけです
通常、UIViewControllerのviewDidLoadで戻るボタンを追加または変更します。
そのような何かが動作するはずです:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton
ビューを閉じるために呼び出される関数を変更して実装することを忘れないでください。
さらに簡単に、タイトルを変更するだけです:
self.navigationItem.leftBarButtonItem.title = "Back"
このコードをdidFinishLaunchingWithOptions launchOptions
にコピーするだけです
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
Swift 4.2の回答を更新
UIAppearance
を使用することは問題を解決するためのよりクリーンな方法ですが、すべてのUIBarButtonItem
にクリアテキストが含まれることになります。ソリューションの改良版は、UIBarButtonItem
がUINavigationBar
に含まれているかどうかを確認することです。
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
簡単な解決策:
1番目のコントローラーから2番目のコントローラーをプッシュしている間に、1番目のコントローラーのviewWillDisappearにself.navigationItem.title = ""を入力します。 2番目のコントローラーから戻るボタンのタイトルを非表示にします。
上記の文は第1コントローラーのタイトルを隠しているため、戻ったときに再び第1コントローラーのタイトルが必要です。そのために、viewWillAppear 1番目のコントローラーの1番目のコントローラーにタイトルを追加があります。
(最初のコントローラーの)以下のメソッドを参照
override func viewWillDisappear(_ animated: Bool) {
self.navigationItem.title = ""
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.title = "Title"
}
スウィフト3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
私の最初の部分的にしか機能しないので、ここに2番目の答えを追加します。このメソッドは、アプリケーションの各ビューでメソッドを呼び出す必要があるという点でエレガントではありませんが、副作用なしで機能します。
最初に、戻るボタンのテキストを削除してカスタムの戻るボタンを追加する関数を含むUIViewController拡張クラスを作成します。
extension UIViewController {
func setBackButton() {
navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
次に、必要な各View ControllerのviewDidLoad
でこの関数を呼び出すだけです。
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
これを使用するだけです:
func removeBackButton(vc:UIViewController) {
let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named:""), for: .normal)
let leftBarButton = UIBarButtonItem.init(customView: button)
vc.navigationItem.leftBarButtonItem = leftBarButton
}
したがって、viewDidLoadでこのメソッドを呼び出します。
override func viewDidLoad() {
super.viewDidLoad()
removeBackButton(vc:self)
}
理由はわかりませんが、iPhoneプラスで戻るボタンのタイトルを非表示にする問題が見つかりましたが、プラスショーのないデバイスでは
leftBarButtonItem.title = ""
だから私は簡単な方法を見つけました。 autolayoutのNavigationViewControllerのNavigationBarで色をクリアするように設定されています。色合いのあるアイコンまたはテキストタイルを使用すると問題になる場合があります。しかし、私の場合、私はそれをすべてとして使用しません。
この拡張機能をUIViewControllerに追加してから、次のようにすべてのviewDidLoad()でこの関数を呼び出すことができます。self.updateBackButton()
extension UIViewController {
func updateBackButton(){
if self.navigationController != nil {
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
}
}}
Swift 4.2&5
後でコードでイメージピッカーを使用している場合に副作用があるナビゲーションバーの色合いで遊ぶ代わりに。
以下のコードを使用:
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
最初のViewControllerから呼び出します:
self.awakeFromNib()
Swift 4.2に対応
AppDelegate
ファイルのコード行をdidFinishLaunchingWithOptions
に使用する
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
私に合ったソリューションを共有したいと思います。また、ニーズと要件に基づいて調整できます。
私の場合、ストーリーボードを使用してCustomNavigationBarを指定することに注意してください
Swift 4.2
class CustomNavigationBar: UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
guard let topItem = topItem else { return }
removeBackButtonTitle(for: topItem)
}
override func pushItem(_ item: UINavigationItem, animated: Bool) {
removeBackButtonTitle(for: item)
super.pushItem(item, animated: animated)
}
func removeBackButtonTitle(for item: UINavigationItem) {
item.backBarButtonItem = UIBarButtonItem()
}
}