を押すとUIViewController
、新規の戻るボタンにUIViewController
タイトルがあります。タイトルにテキストが多いと、iPhone 4sでは見栄えが悪いので、削除したいと思います。
prepareForSegue
関数にコードを追加すると、問題が発生します。
これを達成するためのより良い方法はありますか?
を押すと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)
UPDATE 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)
だからあなたの問題は解決されたのかもしれません。
ハッピーコーディング。
setBackButtonTitlePositionAdjustment
戻るボタンのタイトルが非常に長いが、「戻る」に変更するのに十分な長さではない場合、中央のタイトルが右に移動するため、常に機能するとは限りません。
setBackButtonTitlePositionAdjustment:forBarMetrics:
ユーザーがユーザー補助設定からボタンの形状を有効にした場合、形状が表示されて醜いナビゲーションバーになるという、位置の設定の解決策に強く同意しません。
Swift3の魅力のような作品
self.navigationController?.navigationBar.topItem?.title = " "
navigationController?.pushViewController(_, animated:)
viewWillAppear:
。
私は、中のコード行を使用しているAppDelegate
にファイルdidFinishLaunchingWithOptions
戻るボタンを削除する方法title
。
スイフト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)
setBackButtonTitlePositionAdjustment
戻るボタンのタイトルが非常に長いが、「戻る」に変更するのに十分な長さではない場合、中央のタイトルが右に移動するため、常に機能するとは限りません。
このコードをコピーするだけです didFinishLaunchingWithOptions launchOptions
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
xcode8とswift3.0を使用できます
self.navigationController?.navigationBar.backItem?.title = " "
ViewController
プッシュされたすべてのタイトルが削除されますself.navigationController
UIViewController
この動作が必要なすべてのサブクラスと、サブクラスのサブクラスを作成できますviewDidLoad
。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(
title: "", style: .plain, target: nil, action: nil)
}
このようにして、コードを複製することなく、動作を希望するコントローラーを選択できます。以前のコントローラーのタイトルではなく、「戻る」とだけ言う方がコントローラーの方が好きなので、ここでそのタイトルを設定します。
ここでのrorduluの回答からインスピレーションを得て、このトリッキーな問題のすべてのケースを処理するように見えるカスタム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()
}
}
これで、このナビゲーションコントローラーとバーの組み合わせを使用するたびに、戻るボタンのテキストが表示されることはありません。🎉
注:ストーリーボードを使用している場合も、これは正常に機能するはずです。カスタムナビゲーションバーコンポーネントをビューにドロップしてください。
私は通常、UIViewControllerのviewDidLoadで戻るボタンを追加または変更します。
そのようなものが機能するはずです:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton
ビューを閉じるために呼び出される関数を変更して実装することを忘れないでください。
さらに簡単に、タイトルを変更するだけです。
self.navigationItem.leftBarButtonItem.title = "Back"
スウィフト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)
}
次に、viewDidLoad
必要な各ViewControllerのでこの関数を呼び出すだけです。
簡単な解決策:
1番目のコントローラーから2番目のコントローラーをプッシュしているときに、self.navigationItem.title = ""をviewWillDisappearに配置します。ます。2番目のコントローラーから戻るボタンのタイトルを非表示にします。
上記のステートメントは1番目のコントローラーのタイトルを非表示にしているため、戻ってきたときに1番目のコントローラーのタイトルが再び必要になります。そのために、1番目のコントローラーのviewWillAppearメソッドに1番目のコントローラーのタイトルを追加しました。
(1番目のコントローラーの)以下の方法を参照してください
override func viewWillDisappear(_ animated: Bool) {
self.navigationItem.title = ""
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.title = "Title"
}
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
Swift4.2の回答を更新
で作業するUIAppearance
ことは問題を解決するためのよりクリーンな方法ですが、それはすべてにUIBarButtonItem
明確なテキストを持たせることになります。ソリューションの改善されたバージョンは、UIBarButtonItem
がに含まれているかどうかを確認することですUINavigationBar
。
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
iOS 14では、backButtonDisplayMode
プロパティがUINavigationItem
クラスに表示されるようになりました。したがって、戻るボタンのタイトルを削除するには、
navigationItem.backButtonDisplayMode = .minimal
viewDidLoad
削除するviewControllerの関数で。
すべてのnavigationBarでそれを削除するために、スウィズリングテクニックを使用しました
import UIKit
private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
extension UIViewController {
static func swizzle() {
let originalSelector1 = #selector(viewDidLoad)
let swizzledSelector1 = #selector(swizzled_viewDidLoad)
swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
}
@objc open func swizzled_viewDidLoad() {
if let _ = navigationController {
if #available(iOS 14.0, *) {
navigationItem.backButtonDisplayMode = .minimal
} else {
// Fallback on earlier versions
navigationItem.backButtonTitle = ""
}
}
swizzled_viewDidLoad()
}
}
そしてapplication(_:didFinishLaunchingWithOptions:)
電話で
UIViewController.swizzle()
異なるViewControllerで同様のコードをスウィズリングまたは複製するメソッドを使用したくない人のための簡単なソリューションがあります。
戻るボタンのタイトルを削除するには、UINavigationControllerサブクラスを作成し、pushViewController(_、animated :)メソッドをオーバーライドします。
final class CustomNavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
let backBarButtonItem = UIBarButtonItem()
backBarButtonItem.title = nil
viewController.navigationItem.backBarButtonItem = backBarButtonItem
}
}
iOS13のメソッド。
let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().standardAppearance = navigationBarAppearance
理由はわかりませんが、iPhoneのプラスで戻るボタンのタイトルを非表示にする問題が見つかりましたが、プラスのないデバイスでは正しい
leftBarButtonItem.title = ""
だから私は簡単な方法を見つけました。自動レイアウトのNavigationViewControllerのNavigationBarでクリアする色合いの色が設定されています。アイコンやテキストタイルを色合いで使用すると、問題が発生する可能性があります。しかし、私の場合、私はそれをすべてとして使用しません。
これを使用するだけです:
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)
}
この拡張機能をUIViewControllerに追加してから、次のようにすべてのviewDidLoad()でこの関数を呼び出すことができます:self.updateBackButton()
extension UIViewController {
func updateBackButton(){
if self.navigationController != nil {
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
}
}}
私のために働く解決策を共有したいと思います。また、ニーズや要件に基づいて調整することもできます。
私の場合、ストーリーボードを使用して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()
}
}
以下のための作品スウィフト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)
Swift 4.2&5
コードの後半でイメージピッカーを使用している場合に副作用が発生するナビゲーションバーの色合いで遊ぶ代わりに。
以下のコードを使用してください:
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
最初のViewControllerから呼び出します。
self.awakeFromNib()
UIViewController
with override関数の拡張子を作成し、空のタイトルでawakeFromNib()
作成UIBarButtonItem
してに与えるだけnavigation backBarButtonItem
です。
extension UIViewController {
open override func awakeFromNib() {
let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backBarBtnItem
}
}