UINavigationBar Заголовок кнопки "Назад" нельзя удалить с помощью внешнего вида панели навигации для iOS 13
В моем приложении я хочу удалить UINavigationBar
Заголовок кнопки "Назад". Я сделал следующие коды
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// do other staffs
initNavigationBar()
return true
}
private func initNavigationBar() {
let appearance = UINavigationBar.appearance()
appearance.barTintColor = GLOBAL_TINT_COLOR // a globally declared colour
appearance.tintColor = .white
appearance.barStyle = .black
if #available(iOS 13.0, *) {
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.clear]
appearance.standardAppearance.backButtonAppearance = backButtonAppearance
appearance.compactAppearance?.backButtonAppearance = backButtonAppearance
appearance.scrollEdgeAppearance?.backButtonAppearance = backButtonAppearance
} else {
// Hide navigation bar back button items
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)
}
}
Однако этот код всегда работает для iOS 10-12
, но не работает на iOS 13
. Я что-то пропустил?
В других случаях я нашел много ответов по теме, но не нашел решения для iOS 13
Я никогда не хочу использовать set back button title as an empty string
, а не исправлять это с помощью внешнего вида.
Спасибо
3 ответа
Несколько недель назад у меня была аналогичная проблема. Я не нашел способа сделать это глобально для всего приложения, поэтому прибег к настройке каждого контроллера навигации (чего, к счастью, было немного).
Я сделал что-то подобное, расширив UINavigationController
:
@available(iOS 13, *)
func hideBackButton() {
let appearance = self.navigationBar.standardAppearance
let hideBackButtonTitleAttributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.clear
]
let normalBackButton = appearance.backButtonAppearance.normal
let highlightedBackButton = appearance.backButtonAppearance.highlighted
normalBackButton.titleTextAttributes = hideBackButtonTitleAttributes
highlightedBackButton.titleTextAttributes = hideBackButtonTitleAttributes
navigationBar.standardAppearance = appearance
}
Затем я использовал hideBackButton
метод так:
navigationController?.hideBackButton()
Если есть лучший способ сделать это для всего приложения, дайте мне знать.
Я добавил ios15, удалил заголовок кнопки BackBar и установил навигацию:
if #available(iOS 15, *) {
let appearance = UINavigationBarAppearance()
let pargraphStyle = NSMutableParagraphStyle()
pargraphStyle.alignment = .center
let fontApply = UIFont.bold(size: 18)
UINavigationBar.appearance().tintColor = UIColor.themeColor
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UIColor.black
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.themeColor, NSAttributedString.Key.font: fontApply, NSAttributedString.Key.paragraphStyle: pargraphStyle]
appearance.shadowImage = nil
appearance.shadowColor = .clear
UINavigationBar.appearance().barStyle = .default
UINavigationBar.appearance().tintColor = UIColor.themeColor
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().backIndicatorImage = #imageLiteral(resourceName: "BackIcon")
UINavigationBar.appearance().backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "BackIcon")
UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance
// Set Back Bar Button Appearance
let appearanceBackButton = UIBarButtonItemAppearance()
let hideBackButtonTitleAttributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.clear
]
let normalBackButton = appearance.backButtonAppearance.normal
let highlightedBackButton = appearance.backButtonAppearance.highlighted
normalBackButton.titleTextAttributes = hideBackButtonTitleAttributes
highlightedBackButton.titleTextAttributes = hideBackButtonTitleAttributes
appearance.buttonAppearance = appearanceBackButton
}
Вы можете настроить свой задний элемент так, чтобы он не имел заголовка, например:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:nil style:UIBarButtonItemStylePlain target:nil action:nil];
Обратите внимание, что это влияет на то, что появляется, когда что-то еще помещается в стек навигации. Если вы установите контроллер представления A в качестве корня контроллера навигации и установите такой элемент заднего вида A, вы увидите его, когда вы поместите контроллер представления B в стек. Настройка элемента "Назад" для B не повлияет на то, что вы видите в элементе "Назад", когда элемент B виден.