Wenn ich a drücke UIViewController
, hat es einen Titel in der Zurück-Schaltfläche bei Neu UIViewController
, wenn der Titel viel Text enthält, sieht es in iPhone 4s nicht gut aus. Also möchte ich ihn entfernen.
Wenn ich Code in die prepareForSegue
Funktion einfüge, wird es ein Problem sein.
Gibt es einen besseren Weg, um dies zu erreichen?
ios
swift
uibarbuttonitem
jansma
quelle
quelle
Antworten:
Wenn Sie einen Zurückpfeil wünschen, geben Sie den folgenden Code in die
AppDelegate
Datei in diedidFinishLaunchingWithOptions
Methode ein.For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
Eine weitere Option geben Sie unten.
Im
Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
Im
Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
UPDATE:
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)
Offset verwenden
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
Vielleicht wurde Ihr Problem gelöst.
Viel Spaß beim Codieren.
quelle
setBackButtonTitlePositionAdjustment
funktioniert nicht immer, wenn der Titel der Zurück-Schaltfläche sehr lang ist, aber nicht lang genug, um zu "Zurück" zu wechseln, wird der Titel in der Mitte nach rechts verschoben.setBackButtonTitlePositionAdjustment:forBarMetrics:
Wenn der Benutzer die Schaltflächenform in den Eingabehilfen aktiviert hat, wird die Form als hässliche Navigationsleiste angezeigt.Arbeit ist wie Charme bei Swift 3
self.navigationController?.navigationBar.topItem?.title = " "
quelle
navigationController?.pushViewController(_, animated:)
viewWillAppear:
.Ich verwende diese Codezeile in der
AppDelegate
Datei indidFinishLaunchingWithOptions
Methode, um den Backbutton zu entfernentitle
.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)
quelle
setBackButtonTitlePositionAdjustment
funktioniert nicht immer, wenn der Titel der Zurück-Schaltfläche sehr lang ist, aber nicht lang genug, um zu "Zurück" zu wechseln, wird der Titel in der Mitte nach rechts verschoben.Gehen Sie einfach zu Ihrem übergeordneten ViewController, von dem Ihre anderen ViewController abhängig sind.
override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(true) navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
quelle
Kopieren Sie einfach diesen Code in
didFinishLaunchingWithOptions launchOptions
Swift 5
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
Swift 4
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
quelle
es ist einfach. Setzen Sie ein Leerzeichen in den Titel der Zurück-Schaltfläche und fertig. Denken Sie daran, dass es sich in der vorherigen Ansicht befinden muss, in der Sie den Text entfernen möchten.
quelle
Sie können xcode 8 und swift 3.0 verwenden
self.navigationController?.navigationBar.backItem?.title = " "
quelle
ViewController
s entfernt vonself.navigationController
Sie können eine Unterklasse für alle erstellen
UIViewController
s Sie dieses Verhalten wünschen, und in den UnterklassenviewDidLoad
:override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem( title: "", style: .plain, target: nil, action: nil) }
Auf diese Weise können Sie auswählen, für welche Controller das Verhalten gewünscht wird, ohne den Code zu duplizieren. Ich bevorzuge, dass meine Controller nur "Zurück" sagen, anstatt den Titel des vorherigen Controllers, also setze ich diesen Titel hier.
quelle
let barAppearace = UIBarButtonItem.appearance() barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
hat diese Codezeile in Swift 3.0 verwendet
quelle
Lassen Sie sich von der Antwort von rordulu hier inspirierenIch ließ inspirieren und erstellte schließlich einen benutzerdefinierten UINavigationController und eine UINavigation-Leiste, die alle Fälle dieses kniffligen Problems zu behandeln scheinen.
1) Initialisieren Sie neu
UINavigationController
mit Ihrer GewohnheitUINavigationBar
:class CustomNavigationController: UINavigationController { convenience init() { self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil) } }
2) Setzen Sie die
backItem.title
Eigenschaft der Navigationsleiste jedes Mal, wenn sich die Ansicht selbst anzeigt, auf eine leere Zeichenfolgeclass CustomNavigationBar: UINavigationBar { override func layoutSubviews() { backItem?.title = "" super.layoutSubviews() } }
Jedes Mal, wenn Sie diese Kombination aus Navigationscontroller und Leiste verwenden, wird der Text der Zurück-Schaltfläche nie mehr angezeigt! 🎉
Hinweis: Dies sollte auch bei Verwendung von Storyboards problemlos funktionieren. Stellen Sie lediglich sicher, dass die benutzerdefinierte Navigationsleistenkomponente in der Ansicht abgelegt wird
quelle
Normalerweise füge ich die Schaltfläche "Zurück" in viewDidLoad des UIViewController hinzu oder ändere sie.
So etwas sollte funktionieren:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:") self.navigationItem.leftBarButtonItem = leftButton
Vergessen Sie nicht, die aufgerufene Funktion zum Schließen der Ansicht zu ändern und zu implementieren.
Noch einfacher, ändern Sie einfach den Titel:
self.navigationItem.leftBarButtonItem.title = "Back"
quelle
Swift 3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
quelle
Hier eine zweite Antwort hinzufügen, da meine erste nur teilweise funktioniert. Diese Methode ist weniger elegant, da in jeder Ansicht der Anwendung eine Methode aufgerufen werden muss, sie funktioniert jedoch ohne Nebenwirkungen.
Erstellen Sie zunächst eine UIViewController-Erweiterungsklasse mit einer Funktion zum Entfernen des Textes der Zurück-Schaltfläche und zum Hinzufügen einer benutzerdefinierten Zurück-Schaltfläche:
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) }
Zweitens können wir diese Funktion einfach in
viewDidLoad
jedem View Controller aufrufen, in dem Sie sie benötigen.quelle
Einfache Lösung:
Fügen Sie self.navigationItem.title = "" in viewWillDisappear des 1. Controllers ein, während Sie den 2. Controller vom 1. Controller verschieben . Der Titel der Zurück-Schaltfläche wird vom 2. Controller ausgeblendet.
Die obige Anweisung verbirgt den Titel des 1. Controllers. Wenn wir zurückkommen, möchten wir wieder den Titel für den 1. Controller. Dafür haben wir den Titel für den 1. Controller in der viewWillAppear- Methode des 1. Controllers hinzugefügt .
Siehe folgende Methoden (des 1. Controllers)
override func viewWillDisappear(_ animated: Bool) { self.navigationItem.title = "" } override func viewWillAppear(_ animated: Bool) { self.navigationItem.title = "Title" }
quelle
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
quelle
Aktualisierte Antwort für Swift 4.2
Die Arbeit mit
UIAppearance
ist eine sauberere Art, das Problem zu lösen, aber es würde dazu führen, dass alleUIBarButtonItem
einen klaren Text haben. Eine verbesserte Version der Lösung könnte darin bestehen, zu überprüfen, ob dieUIBarButtonItem
in a enthalten istUINavigationBar
.UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
quelle
Funktioniert mit Swift 5 :
self.navigationItem.backBarButtonItem?.title = ""
Bitte beachten Sie, dass dies für den nächsten Push-View-Controller wirksam ist, nicht für den aktuellen auf dem Display. Deshalb ist es sehr verwirrend!
Überprüfen Sie auch das Storyboard und wählen Sie das Navigationselement des vorherigen Ansichts-Controllers aus. Geben Sie dann etwas in die Schaltfläche Zurück (Inspektor) ein.
quelle
Ich habe eine einfache Lösung für diejenigen, die kein Methoden-Swizzling oder Duplizieren eines ähnlichen Codes in verschiedenen View-Controllern verwenden möchten.
Um den Titel der Zurück-Schaltfläche zu entfernen, erstellen Sie eine UINavigationController-Unterklasse und überschreiben Sie die pushViewController-Methode (_, animiert :):
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 } }
quelle
Ich weiß nicht warum, aber ich habe ein Problem mit dem Ausblenden des Zurück-Button-Titels in iPhone Plus gefunden, aber in Geräten ohne Plus-Shows mit
leftBarButtonItem.title = ""
Also habe ich einen einfachen Weg gefunden. In der Navigationsleiste von NavigationViewController im Autolayout wird die Farbtonfarbe so eingestellt, dass sie gelöscht wird. Es kann problematisch sein, wenn Sie Symbole oder Textkacheln mit Farbton verwenden. Aber in meinem Fall benutze ich es nicht als alles.
quelle
Verwenden Sie einfach dies:
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 }
Rufen Sie diese Methode in viewDidLoad auf:
override func viewDidLoad() { super.viewDidLoad() removeBackButton(vc:self) }
quelle
Sie können diese Erweiterung zu UIViewController hinzufügen und diese Funktion dann in jedem viewDidLoad () wie folgt aufrufen: self.updateBackButton ()
extension UIViewController { func updateBackButton(){ if self.navigationController != nil { self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil) } }}
quelle
Ich möchte eine Lösung teilen, die für mich funktioniert. Es kann auch an Ihre Bedürfnisse und Anforderungen angepasst werden.
Beachten Sie, dass ich in meinem Fall ein Storyboard verwende, um CustomNavigationBar anzugeben
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() } }
quelle
Funktioniert für Swift 4.2
Verwenden der Codezeile in der
AppDelegate
Datei indidFinishLaunchingWithOptions
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)
quelle
Swift 4.2 & 5
Anstatt mit der Tönungsfarbe der Navigationsleiste zu spielen, die Nebenwirkungen hat, wenn Sie die Bildauswahl später in Ihrem Code verwenden.
Verwenden Sie den folgenden Code:
extension UIViewController { open override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } }
Rufen Sie es von Ihrem ersten ViewController aus auf:
self.awakeFromNib()
quelle
für schnelle 4,5
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
quelle
Erstellen Sie einfach eine Erweiterung
UIViewController
mit Override-FunktionawakeFromNib()
und erstellen SieUIBarButtonItem
mit einem leeren Titel und geben Sie annavigation backBarButtonItem
.extension UIViewController { open override func awakeFromNib() { let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarBtnItem } }
quelle
Geben Sie den folgenden Code in einen der Codes ein, um den
UIViewcontroller extension
gesamtenUIViewcontroller
Rückentext auszublendenopen override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
quelle
im
viewDidLoad()
let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarButtonItem
quelle
Ich habe eine einfache Lösung gefunden:
bei
PersingtingViewController's
viewWillDisappear
Methode jsut setzenself.title = ""
und stellt
title
fürPersingtingViewController's
on -viewWillAppear
Methode. Und wiederholen Sie dies für alleviewControllers
von dernavigationStack
Ausnahme letzte.quelle
Unter iOS 14 ist die
backButtonDisplayMode
Eigenschaft nun in derUINavigationItem
Klasse vorhanden. Um den Titel der Zurück-Schaltfläche zu entfernen, können Sie ihn verwendenin der Funktion
viewDidLoad
des viewControllers, wo Sie es entfernen möchten.Um es in allen Navigationsleisten zu entfernen, habe ich die Swizzling-Technik verwendet
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() } }
Und auf
application(_:didFinishLaunchingWithOptions:)
AbrufUIViewController.swizzle()
quelle