Jak mogę ukryć tekst przycisku Wstecz przed kontrolerem UINavigation? Będę mieć tylko „<”, a nie „<Wstecz”
Jak mogę ukryć tekst przycisku Wstecz przed kontrolerem UINavigation? Będę mieć tylko „<”, a nie „<Wstecz”
Odpowiedzi:
W konstruktorze interfejsu możesz wybrać element nawigacyjny poprzedniego kontrolera i zmienić Back Button
ciąg na taki, jak ma wyglądać przycisk Wstecz. Jeśli na przykład chcesz, aby było puste, po prostu wstaw spację.
Możesz go również zmienić za pomocą tej linii kodu:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Lub w Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
jest już puste w IB, po prostu dodaj spację, aby uzyskać jazdę Back
i po prostu pokaż strzałkę.
Możesz to również zrobić za pomocą scenorysu. W inspektorze atrybutów elementu nawigacyjnego poprzedniego kontrolera możesz ustawić "" w polu przycisku Wstecz. Zobacz zdjęcie poniżej. Zastąp „Tutaj Twój tytuł” na „”. W ten sposób osiągniesz pożądany rezultat. Nie musisz już mieszać z „tytułem”.
Programowo możesz użyć
[self.navigationItem.backBarButtonItem setTitle:@" "];
gdzie self oznacza kontroler, który wypycha żądany kontroler widoku.
Przykładowy pasek nawigacji przed i po
Przed
Po
backBarButtonItem
programowe nie działa, ale ustawienie go za pomocą scenorysu działa.
backBarButtonItem
programowo działa u mnie w iOS 9.
Możesz zaimplementować w UINavigationControllerDelegate
ten sposób:
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
jest nil
domyślnie i wpływa na następny wciśnięty kontroler, więc po prostu ustawiasz go dla wszystkich kontrolerów
Ustawienie tytułu przycisku Wstecz na @""
lub nil
nie działa. Musisz ustawić pusty przycisk (bez tytułu lub obrazu):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Należy to zrobić na kontrolerze widoku, który znajduje się na górze kontrolera widoku w stosie nawigacji (tj. Z miejsca, w którym przechodzisz do swojego VC za pomocą pushViewController
metody)
Innym rozwiązaniem tego problemu w sytuacjach, w których masz wielu kontrolerów widoku, jest użycie UIAppearance
serwera proxy, aby skutecznie ukryć tekst tytułu przycisku Wstecz w następujący sposób:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
To rozwiązanie spowoduje renderowanie tekstu jako niewielkiej, wyraźnej kropki, podobnie jak w przypadku ręcznego ustawiania tytułu przycisku Wstecz na @" "
, z tą różnicą, że ma wpływ na wszystkie przyciski paska nawigacji.
Nie sugeruję tego jako ogólnego rozwiązania problemu, ponieważ ma to wpływ na wszystkie przyciski paska nawigacji. Odwraca paradygmat, dzięki czemu możesz wybrać, kiedy mają być wyświetlane tytuły przycisków, a nie kiedy je ukrywać .
Aby wybrać, kiedy mają być wyświetlane tytuły, przywróć ręcznie atrybuty tekstu tytułu zgodnie z potrzebami lub utwórz specjalną podklasę, UIBarButtonItem
która robi to samo (potencjalnie z innym UIAppearance
proxy).
Jeśli masz aplikację, w której większość tytułów przycisków wstecz musi być ukryta, a tylko kilka (lub żaden) z przycisków nawigacyjnych to przyciski systemowe z tytułami, może to być dla Ciebie!
(Uwaga: zmiana rozmiaru czcionki jest konieczna, mimo że kolor tekstu jest wyraźny, aby mieć pewność, że długie tytuły nie spowodują przesunięcia tytułu środkowego paska nawigacyjnego)
Dodaj następujący kod w viewDidLoad lub loadView
self.navigationController.navigationBar.topItem.title = @"";
Przetestowałem to na iPhonie i iPadzie z iOS 9
Możesz dodać tę kategorię Cel-C, aby wszystkie przyciski „Wstecz” utworzone przez kontroler nawigacji nie miały tekstu. Właśnie dodałem go do mojego pliku AppDelegate.m.
@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 - (Nie wiem, jak sprawić, by to rozszerzenie działało w Swift, zawierało dziwne błędy. Mile widziane zmiany, aby dodać wersję Swift)
override
to szybko. Bardzo ciekawe pytanie
Próbowałem powyżej i poniżej, ale nie zadziałały. To zadziałało dla mnie:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Jedyną rzeczą, która działa bez efektów ubocznych, jest utworzenie niestandardowego przycisku Wstecz. Dopóki nie podasz niestandardowej akcji, działa nawet gest slajdu.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Niestety, jeśli chcesz, aby wszystkie przyciski Wstecz nie miały żadnych tytułów, musisz skonfigurować ten niestandardowy przycisk Wstecz we wszystkich kontrolerach widoku: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Bardzo ważne jest, aby jako tytuł ustawić spację, a nie pusty ciąg.
aby programowo usunąć tekst z przycisku wstecznego, użyty poniżej kodu będzie działał z xcode7 i nowszymi.
self.navigationController.navigationBar.topItem.title = @ "";
lub
manualLy w scenorysach, wybierz pasek nawigacji na kontrolerze widoku i wstaw „” w tekście przycisku Wstecz.
to zadziała. dzięki
self.navigationController?.navigationBar.topItem?.title = " "
w Xcode 9 i działałem!
Obecna odpowiedź nie działa. Chciałem całkowicie usunąć tytuł , ale tekst „wstecz” nie znikał.
Wróć do poprzedniego kontrolera widoku i ustaw jego właściwość title:
self.title = @" ";
Działa TYLKO wtedy, gdy poprzedni kontroler widoku nie ma tytułu
@""
.
Alternatywny sposób - użyj niestandardowej klasy NavigationBar.
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()
}
}
Oznacza to, że spowoduje to usunięcie z powrotem tytułów całego projektu. Po prostu ustaw niestandardową klasę dla UINavigationController.
Ustaw tytuł poprzedniego VC na ciąg znaków ze spacją. a tytuł z przyciskiem wstecz zostanie zastąpiony pojedynczym ciągiem spacji.
Self.title = " "
Ponownie naciśnij przycisk Wstecz, aby przywrócić oryginalny tytuł w widokuWillAppear.
Użyj niestandardowego, NavigationController
który zastępujepushViewController
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)
}
}
Wiele już odpowiedzi, oto moje dwa grosze na ten temat. Uważam, że to podejście jest naprawdę solidne. Musisz tylko umieścić to w viewController przed segue.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Próbowałem wszystkiego w tym poście. Jedynym działającym rozwiązaniem jest @ VoidLess
Oto ta sama odpowiedź, ale bardziej kompletna
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)
}
}
To jest moje rozwiązanie dla iOS11, zmieniam wygląd UIBarButtonItem w applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Nie możesz zmienić przesunięcia Y, ponieważ zmieni to również pozycję przycisku paska wstecznego w iOS11, ale jest OK w iOS10 i poniżej.
W Swift3,
Jeśli ustawisz ustawienie globalne
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)
// ...
}
Swift 3.1 Możesz to zrobić, implementując metodę delegata UINavigationController.
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
}
Dla tych, którzy chcą ukryć tytuł przycisku wstecz na całym świecie.
Można swizzle viewDidLoad
od UIViewController
tak.
+ (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);
}
}
Stosowanie:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Jeśli celujesz w system iOS 13 lub nowszy, możesz użyć tego nowego interfejsu API, aby globalnie ukryć tytuł przycisku Wstecz .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Walczyłem z tym, ponieważ miałem niestandardowy kontroler nawigacyjny. Udało mi się usunąć tekst elementu z tyłu we wszystkich kontrolerach widoku z tym kodem w mojej niestandardowej klasie kontrolera nawigacji
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Spowoduje to usunięcie wszystkich tytułów elementów z tyłu za pomocą tego niestandardowego kontrolera nawigacji.
W iOS 11 odkryliśmy, że ustawienie UIBarButtonItem
czcionki / koloru tekstu wyglądu na bardzo małą wartość lub wyraźny kolor spowoduje zniknięcie innego elementu paska (system nie honoruje już klasy elementu UIBarButton, konwertuje go na_UIModernBarButton
). Również ustawienie przesunięcia tylnego tekstu poza ekran spowoduje miganie podczas interaktywnego popu.
Więc zawaliliśmy 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];
}
Tekst z tyłu pochodzi z ostatniego kontrolera widoku navigationItem.title
, i navigationItem.title
jest automatycznie ustawiany przez self.title
. Tak prostym sposobem rozwiązania problemu jest hak setTitle:
, upewnij sięnavigationItem.title = @""
Wpisz ten kod na, żeby AppDelegate.m
wszystko było w porządku。
[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];
Więcej szczegółów na https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
Moje rozwiązanie: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Bardzo prostym - choć może trochę hackerskim - sposobem zrobienia tego programowo, jeśli nie potrzebujesz niestandardowego przycisku Wstecz, jest ustawienie rozmiaru czcionki równego zeru w kontrolerze widoku, który wkładasz na stos, wywołując coś takiego from 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
}
Wreszcie znalazłem idealne rozwiązanie, aby ukryć domyślny tekst w całej aplikacji.
Po prostu dodaj jeden przezroczysty obraz i dodaj następujący kod w swoim AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Poniższa metoda działa w systemie iOS 11 i nie ulega awarii w innych wersjach systemu iOS. Może to spowodować odrzucenie aplikacji w recenzji App Store, ponieważ zarówno UIModernBarButton, jak i UIBackButtonContainerView są prywatnymi interfejsami API. Umieść w AppDelegate.
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)
}
Wersja Swift, działa doskonale globalnie:
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
. Jak wskazał @limfinity, zmieni to uniwersalnie dla wszystkich UIBarButtonItem w całej aplikacji