Kiedy wciskam UIViewController
, ma jakiś tytuł w przycisku Wstecz na nowym UIViewController
, jeśli tytuł ma dużo tekstu, nie wygląda dobrze w iPhone 4s, więc chcę go usunąć.
Jeśli dodam kod w prepareForSegue
funkcji, będzie to problem.
Każdy lepszy sposób na osiągnięcie tego?
ios
swift
uibarbuttonitem
jansma
źródło
źródło
Odpowiedzi:
Jeśli chcesz strzałkę wstecz, następujący kod należy umieścić w
AppDelegate
pliku wdidFinishLaunchingWithOptions
metodzie.For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
Inna opcja podana poniżej.
W
Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
W
Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
AKTUALIZACJA :
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)
ZAKTUALIZUJ 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)
Korzystanie z przesunięcia
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
Więc może twój problem został rozwiązany.
Miłego kodowania.
źródło
setBackButtonTitlePositionAdjustment
nie zawsze działa, gdy tytuł przycisku Wstecz jest bardzo długi, ale nie jest wystarczająco długi, aby zmienić na „Wstecz”, tytuł w środku przesunie się w prawo.setBackButtonTitlePositionAdjustment:forBarMetrics:
jeśli użytkownik włączył kształt przycisku w ustawieniach dostępności, kształt pokaże się kończąc na brzydkim pasku nawigacyjnym.Praca w Swift 3 jest jak urok
self.navigationController?.navigationBar.topItem?.title = " "
źródło
navigationController?.pushViewController(_, animated:)
viewWillAppear:
.Używam tej linii kodu w
AppDelegate
pliku dodidFinishLaunchingWithOptions
metody, aby usunąć przycisk backbuttontitle
.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)
źródło
setBackButtonTitlePositionAdjustment
nie zawsze działa, gdy tytuł przycisku Wstecz jest bardzo długi, ale nie jest wystarczająco długi, aby zmienić na „Wstecz”, tytuł w środku przesunie się w prawo.Wystarczy przejść do nadrzędnego kontrolera ViewController, od którego są zależne inne kontrolery ViewController.
override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(true) navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
źródło
Po prostu skopiuj ten kod
didFinishLaunchingWithOptions launchOptions
Szybki 5
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
Szybki 4
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
źródło
to jest proste. wstaw spację w tytule przycisku Wstecz i gotowe. Pamiętaj, że w poprzednim widoku musi znajdować się miejsce, w którym chcesz usunąć tekst.
źródło
Możesz użyć Xcode 8 i Swift 3.0
self.navigationController?.navigationBar.backItem?.title = " "
źródło
ViewController
pchniętych zself.navigationController
Możesz utworzyć podklasę dla wszystkich, dla
UIViewController
których chcesz to zachowanie, oraz w podklasieviewDidLoad
:override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem( title: "", style: .plain, target: nil, action: nil) }
W ten sposób możesz wybrać kontrolery, dla których chcesz zachować zachowanie, bez duplikowania kodu. Wolę, aby moje kontrolery po prostu mówiły „Wstecz” zamiast tytułu poprzedniego kontrolera, więc ustawiłem ten tytuł tutaj.
źródło
let barAppearace = UIBarButtonItem.appearance() barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
użył tej linii kodu w swift 3.0
źródło
Czerpiąc inspirację z rordulu męska odpowiedź tutaj , skończyło się na tworzeniu własnego UINavigationController i bar UINavigation który wydaje się obsłużyć wszystkie przypadki tej skomplikowanej problemu.
1) Zainicjuj nowy
UINavigationController
ze swoim niestandardowymUINavigationBar
:class CustomNavigationController: UINavigationController { convenience init() { self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil) } }
2) Ustaw
backItem.title
właściwość paska nawigacji na pusty ciąg za każdym razem, gdy widok się rozkładaclass CustomNavigationBar: UINavigationBar { override func layoutSubviews() { backItem?.title = "" super.layoutSubviews() } }
Teraz za każdym razem, gdy użyjesz tej kombinacji kontrolera nawigacyjnego i paska, nigdy nie będzie miała tekstu przycisku Wstecz! 🎉
Uwaga: powinno to działać dobrze, jeśli używasz również scenorysów, po prostu upuść niestandardowy komponent paska nawigacji w widoku
źródło
Zwykle dodaję lub zmieniam przycisk Wstecz w viewDidLoad w UIViewController.
Coś takiego powinno działać:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:") self.navigationItem.leftBarButtonItem = leftButton
Nie zapomnij zmienić i zaimplementować funkcji, którą jest wywoływana, aby zamknąć widok.
Jeszcze łatwiej, po prostu zmień tytuł:
self.navigationItem.leftBarButtonItem.title = "Back"
źródło
Swift 3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
źródło
Dodanie tutaj drugiej odpowiedzi jako pierwszej działa tylko częściowo. Ta metoda jest mniej elegancka, ponieważ wymaga wywołania metody w każdym widoku aplikacji, jednak działa bez żadnych skutków ubocznych.
Najpierw utwórz klasę rozszerzenia UIViewController z funkcją usuwania tekstu przycisku Wstecz i dodawania niestandardowego przycisku Wstecz:
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) }
Po drugie, możemy po prostu wywołać tę funkcję w
viewDidLoad
każdym kontrolerze widoku, w którym jest ona potrzebna.źródło
Proste rozwiązanie:
Podczas wciskania drugiego kontrolera z pierwszego kontrolera, wstaw self.navigationItem.title = "" w pole viewWillDisappear pierwszego kontrolera. Ukrywa tytuł przycisku wstecz przed drugim kontrolerem.
Powyższa pozycja ukrywa tytuł pierwszego kontrolera, dlatego kiedy wróciliśmy, chcemy ponownie uzyskać tytuł pierwszego kontrolera. W tym celu dodaliśmy tytuł pierwszego kontrolera w metodzie viewWillAppear pierwszego kontrolera.
Zobacz następujące metody (pierwszego kontrolera)
override func viewWillDisappear(_ animated: Bool) { self.navigationItem.title = "" } override func viewWillAppear(_ animated: Bool) { self.navigationItem.title = "Title" }
źródło
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
źródło
Zaktualizowana odpowiedź dla Swift 4.2
Praca z
UIAppearance
to czystszy sposób rozwiązania problemu, ale spowodowałaby, że wszystkieUIBarButtonItem
miałyby jasny tekst. Ulepszoną wersją rozwiązania mogłoby być sprawdzenie, czyUIBarButtonItem
plik znajduje się w plikuUINavigationBar
.UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
źródło
W systemie iOS 14
backButtonDisplayMode
właściwość jest teraz obecna wUINavigationItem
klasie. Tak więc, aby usunąć tytuł przycisku Wstecz, którego możesz użyćw
viewDidLoad
funkcji viewController, w którym chcesz go usunąć.Aby usunąć to w całym pasku nawigacji, użyłem techniki swizzling
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() } }
I na
application(_:didFinishLaunchingWithOptions:)
telefonUIViewController.swizzle()
źródło
Działa na Swift 5 :
self.navigationItem.backBarButtonItem?.title = ""
Należy pamiętać, że będzie to skuteczne dla następnego naciśniętego kontrolera widoku, a nie dla bieżącego na wyświetlaczu, dlatego jest bardzo zagmatwany!
Sprawdź także scenorys i wybierz element nawigacyjny poprzedniego kontrolera widoku, a następnie wpisz coś w przycisku Wstecz (Inspektor).
źródło
Mam proste rozwiązanie dla tych, którzy nie chcą używać swizzlingu metod lub powielania podobnego kodu w różnych kontrolerach widoku.
Aby usunąć tytuł przycisku Wstecz, utwórz podklasę UINavigationController i nadpisz metodę 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 } }
źródło
Metoda dla iOS13.
let backButtonAppearance = UIBarButtonItemAppearance(style: .plain) backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear] let navigationBarAppearance = UINavigationBarAppearance() navigationBarAppearance.backButtonAppearance = backButtonAppearance UINavigationBar.appearance().standardAppearance = navigationBarAppearance
źródło
Nie wiem dlaczego, ale znalazłem problem z ukrywaniem tytułu przycisku wstecz w plusach iPhone'a, ale w urządzeniu bez plusa pokazuje się poprawnie z
leftBarButtonItem.title = ""
Więc znalazłem prosty sposób. Kolor tinta jest ustawiony na wyczyszczenie w NavigationBar elementu NavigationViewController w autoukładaniu. Może to stanowić problem, jeśli używasz ikon lub kafelków tekstowych z odcieniem. Ale w moim przypadku nie używam tego jako wszystkiego.
źródło
Po prostu użyj tego:
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 }
Wywołaj więc tę metodę w viewDidLoad:
override func viewDidLoad() { super.viewDidLoad() removeBackButton(vc:self) }
źródło
Możesz dodać to rozszerzenie do UIViewController, a następnie wywołać tę funkcję w każdym viewDidLoad (), na przykład: self.updateBackButton ()
extension UIViewController { func updateBackButton(){ if self.navigationController != nil { self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil) } }}
źródło
Chciałbym podzielić się rozwiązaniem, które działa dla mnie. Ponadto można go dostosować w zależności od potrzeb i wymagań.
Uwaga: w moim przypadku używam scenorysu, aby określić 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() } }
źródło
Działa dla Swift 4.2
Użycie linii kodu w
AppDelegate
pliku dodidFinishLaunchingWithOptions
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)
źródło
Swift 4.2 i 5
Zamiast bawić się odcieniem paska nawigacji, który będzie miał efekty uboczne, jeśli użyjesz selektora obrazu w dowolnym momencie później w kodzie.
Użyj poniższego kodu:
extension UIViewController { open override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } }
Wywołaj to z pierwszego ViewController:
self.awakeFromNib()
źródło
za szybkie 4,5
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
źródło
Po prostu utwórz rozszerzenie
UIViewController
z funkcją overrideawakeFromNib()
i utwórzUIBarButtonItem
z pustym tytułem i dajnavigation backBarButtonItem
.extension UIViewController { open override func awakeFromNib() { let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarBtnItem } }
źródło
Umieść poniższy kod w dowolnym miejscu
UIViewcontroller extension
, aby ukryć całyUIViewcontroller
tekst z tyłuopen override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
źródło
w
viewDidLoad()
let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarButtonItem
źródło