Wie kann ich den Text der Zurück-Schaltfläche vor einem UINavigation-Controller ausblenden? Ich werde nur das "<" und nicht das "<Zurück" haben
Wie kann ich den Text der Zurück-Schaltfläche vor einem UINavigation-Controller ausblenden? Ich werde nur das "<" und nicht das "<Zurück" haben
Antworten:
Im Interface Builder können Sie das Navigationselement des vorherigen Controllers auswählen und die Back Button
Zeichenfolge so ändern, dass die Schaltfläche "Zurück" angezeigt wird. Wenn Sie es beispielsweise leer lassen möchten, setzen Sie einfach ein Leerzeichen.
Sie können es auch mit dieser Codezeile ändern :
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Oder in Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
IB bereits leer ist, fügen Sie einfach ein Leerzeichen hinzu Back
und zeigen Sie den Pfeil.
Sie können dies auch über das Storyboard tun. Im Attributinspektor des Navigationselements des vorherigen Controllers können Sie im Feld Zurück die Schaltfläche "" festlegen. Siehe Bild unten. Ersetzen Sie "Ihr Titel hier" durch "". Auf diese Weise erzielen Sie das gewünschte Ergebnis. Sie müssen sich nicht mehr mit dem Titel herumschlagen.
Programmatisch könnten Sie verwenden
[self.navigationItem.backBarButtonItem setTitle:@" "];
Dabei bezieht sich self auf den Controller, der den gewünschten View-Controller drückt.
Beispiel vor, nach der Navigationsleiste
Vor
Nach dem
backBarButtonItem
funktioniert das programmgesteuerte Festlegen nicht, das Festlegen über das Storyboard jedoch.
backBarButtonItem
programmgesteuerte Einstellung funktioniert für mich in iOS 9.
Sie können Folgendes implementieren UINavigationControllerDelegate
:
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem
ist nil
standardmäßig aktiviert und wirkt sich auf den nächsten Push-Controller aus. Sie müssen ihn also nur für alle Controller festlegen
Das Setzen des Titels der Zurück-Taste auf @""
oder nil
funktioniert nicht. Sie müssen die gesamte Schaltfläche leer lassen (ohne Titel oder Bild):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Dies sollte auf dem Ansichts-Controller erfolgen, der sich im Navigationsstapel über Ihrem Ansichts-Controller befindet (dh von wo aus Sie über die pushViewController
Methode zu Ihrem VC navigieren ).
Eine andere Lösung für dieses Problem in Situationen, in denen Sie viele View-Controller haben, besteht darin, einen UIAppearance
Proxy zu verwenden, um den Titeltext der Zurück-Schaltfläche wie folgt effektiv auszublenden:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Bei dieser Lösung wird der Text als winziger klarer Punkt gerendert, ähnlich wie beim manuellen Festlegen des Titels der Zurück-Schaltfläche @" "
, mit der Ausnahme, dass alle Schaltflächen der Navigationsleiste betroffen sind.
Ich empfehle dies nicht als allgemeine Lösung für das Problem, da es alle Schaltflächen der Navigationsleiste betrifft. Das Paradigma wird umgedreht, sodass Sie auswählen können, wann die Schaltflächentitel angezeigt werden sollen, anstatt wann die Titel ausgeblendet werden sollen.
Um zu entscheiden, wann die Titel angezeigt werden sollen, stellen Sie entweder die Titeltextattribute nach Bedarf manuell wieder her oder erstellen Sie eine spezielle Unterklasse UIBarButtonItem
, die dasselbe tut (möglicherweise mit einem anderen UIAppearance
Proxy).
Wenn Sie eine App haben, in der die meisten Titel der Zurück-Schaltfläche ausgeblendet werden müssen und nur wenige (oder keine) der Navi-Schaltflächen Systemschaltflächen mit Titeln sind, ist dies möglicherweise das Richtige für Sie!
(Hinweis: Die Änderung der Schriftgröße ist erforderlich, obwohl die Textfarbe klar ist, um sicherzustellen, dass bei langen Titeln der Titel der mittleren Navigationsleiste nicht verschoben wird.)
Fügen Sie den folgenden Code in viewDidLoad oder loadView hinzu
self.navigationController.navigationBar.topItem.title = @"";
Ich habe es in iPhone und iPad mit iOS 9 getestet
Sie können diese Objective-C-Kategorie hinzufügen, damit alle von einem Navigationscontroller erstellten "Zurück" -Schaltflächen keinen Text enthalten. Ich habe es gerade zu meiner AppDelegate.m-Datei hinzugefügt.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
PS - (Ich weiß nicht, wie diese Erweiterung mit Swift funktioniert, sie hatte seltsame Fehler. Änderungen sind willkommen, um eine Swift-Version hinzuzufügen.)
override
es schnell geht. Sehr interessante Frage
Ich habe einige oben und unten ausprobiert, aber sie haben nicht funktioniert. Das hat bei mir funktioniert:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Das einzige, was ohne Nebenwirkungen funktioniert, ist das Erstellen einer benutzerdefinierten Zurück-Schaltfläche. Solange Sie keine benutzerdefinierte Aktion angeben, funktioniert auch die Foliengeste.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Wenn Sie möchten, dass alle Zurück-Schaltflächen keine Titel enthalten, müssen Sie diese benutzerdefinierte Zurück-Schaltfläche in allen View-Controllern einrichten: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Es ist sehr wichtig, dass Sie ein Leerzeichen als Titel und nicht als leere Zeichenfolge festlegen.
Um den Text programmgesteuert vom Backbutton zu entfernen, der unter Code verwendet wird, funktioniert dies ab xcode7.
self.navigationController.navigationBar.topItem.title = @ "";
oder
manuell Wählen Sie in Storyboards die Navigationsleiste auf dem Ansichts-Controller aus und fügen Sie "" in den Text der Zurück-Schaltfläche ein.
das wird funktionieren. Vielen Dank
self.navigationController?.navigationBar.topItem?.title = " "
in Xcode 9 und gearbeitet!
Die aktuelle Antwort funktionierte nicht. Ich wollte den Titel komplett entfernen , aber der Text "zurück" verschwand nicht.
Kehren Sie zum vorherigen Ansichts-Controller zurück und legen Sie dessen title-Eigenschaft fest:
self.title = @" ";
Funktioniert NUR, wenn der vorherige View Controller keinen Titel hat
@""
.
Alternative Möglichkeit: Verwenden Sie eine benutzerdefinierte NavigationBar-Klasse.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
Das heißt, dies entfernt das gesamte Projekt zurück. Legen Sie einfach eine benutzerdefinierte Klasse für UINavigationController fest.
Setzen Sie den Titel der vorherigen VC auf "" Zeichenfolge mit Leerzeichen. und Titel mit der Zurück-Schaltfläche werden durch eine einzelne Leerzeichenfolge ersetzt.
Self.title = " "
Bei Zurück drücken Sie erneut, um den Titel in viewWillAppear auf den ursprünglichen zurückzusetzen.
Verwenden Sie einen benutzerdefinierten Benutzer NavigationController
, der überschreibtpushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
Viele Antworten schon, hier sind meine zwei Cent zu diesem Thema. Ich fand diesen Ansatz sehr robust. Sie müssen dies nur in viewController einfügen, bevor Sie fortfahren.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Ich habe alles in diesem Beitrag versucht. Die einzige funktionierende Lösung ist @ VoidLess's
Hier ist die gleiche Antwort, aber vollständiger
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
Dies ist meine Auflösung für iOS11. Ich ändere das Erscheinungsbild von UIBarButtonItem in applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Sie können den Y-Versatz nicht ändern, da dadurch auch die Position der Schaltfläche für die hintere Leiste in iOS11 geändert wird. In iOS10 und darunter ist dies jedoch in Ordnung.
Swift 3.1 Sie können dies tun, indem Sie die Delegate-Methode von UINavigationController implementieren.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Für diejenigen, die den Titel der Zurück-Schaltfläche global ausblenden möchten.
Sie können swizzle viewDidLoad
von UIViewController
so.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
Verwendung:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
In Swift3
Wenn Sie die globale Einstellung festlegen
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Ich hatte damit zu kämpfen, weil ich einen benutzerdefinierten Navigationscontroller hatte. Mit diesem Code konnte ich den Text des hinteren Elements in allen Ansichts-Controllern in meiner benutzerdefinierten Navigations-Controller-Klasse entfernen
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Dadurch werden alle Titel der hinteren Elemente mithilfe dieses benutzerdefinierten Navigationscontrollers entfernt.
Wenn Sie auf iOS 13 und höher abzielen , können Sie diese neue API verwenden , um den Titel der Zurück-Schaltfläche global auszublenden .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
In iOS 11 haben wir festgestellt, dass das Festlegen UIBarButtonItem
der Textschrift / -farbe des Erscheinungsbilds auf einen sehr kleinen Wert oder eine klare Farbe dazu führt, dass andere Balkenelemente verschwinden (das System berücksichtigt die Klasse der UIBarButton-Elemente nicht mehr, sondern konvertiert sie in a _UIModernBarButton
). Wenn Sie auch den Versatz des Rücktextes auf Offscreen setzen, blinkt dies während des interaktiven Pop.
Also haben wir geschwatzt addSubView
:
+ (void)load {
if (@available(iOS 11, *)) {
[NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
}
}
- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
view.alpha = 0;
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (id)view;
[button setTitle:@" " forState:UIControlStateNormal];
}
[self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}
Der hintere Text stammt vom View des letzten View Controllers navigationItem.title
und navigationItem.title
wird automatisch von festgelegt self.title
. So einfach, um das Problem zu lösen, ist Haken hook setTitle:
stellen Sie sichernavigationItem.title = @""
Geben Sie diesen Code ein AppDelegate.m
, damit es in Ordnung ist。
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
Weitere Informationen unter https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
Meine Lösung: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Eine sehr einfache - wenn auch etwas hackige - Möglichkeit, dies programmgesteuert zu tun, wenn Sie die benutzerdefinierte Zurück-Schaltfläche nicht benötigen, besteht darin, die Schriftgröße in dem View-Controller, den Sie auf den Stapel schieben, auf Null zu setzen und so etwas aufzurufen von viewDidLoad
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
Endlich die perfekte Lösung gefunden, um Standard-Backtext in der gesamten App auszublenden.
Fügen Sie einfach ein transparentes Bild hinzu und fügen Sie den folgenden Code in Ihr AppDelegate ein.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Die folgende Methode funktioniert unter iOS 11 und kann unter anderen iOS-Versionen nicht zum Absturz gebracht werden. Wenn Sie dies tun, wird Ihre App möglicherweise in der App Store-Überprüfung abgelehnt, da sowohl UIModernBarButton als auch UIBackButtonContainerView private APIs sind. In AppDelegate platzieren.
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Schnelle Version, funktioniert weltweit perfekt:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
return true
}
solution
. Wie @limfinity zeigte, wird es universell für alle UIBarButtonItems in der gesamten App