Как я могу скрыть текст кнопки «Назад» от контроллера навигации UIN? У меня будет только «<», а не «<Назад»
Как я могу скрыть текст кнопки «Назад» от контроллера навигации UIN? У меня будет только «<», а не «<Назад»
Ответы:
В конструкторе интерфейса вы можете выбрать элемент навигации предыдущего контроллера и изменить Back Button
строку на то, как вы хотите, чтобы кнопка возврата отображалась как.Например, если вы хотите, чтобы он был пустым, просто поставьте пробел.
Вы также можете изменить его с помощью этой строки кода:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Или в Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
в IB уже пусто, просто добавьте пробел Back
и покажите стрелку.
Вы также можете сделать это с помощью раскадровки. В инспекторе атрибутов элемента навигации предыдущего контроллера вы могли установить "" в поле кнопки "Назад". См. Изображение ниже. Замените «Ваш заголовок здесь» на «». Тем самым вы добьетесь желаемого результата. Вам больше не нужно возиться с «Заголовком».
Программно вы могли бы использовать
[self.navigationItem.backBarButtonItem setTitle:@" "];
где self относится к контроллеру, который подталкивает желаемый контроллер View.
Образец до, после панели навигации
Перед
После
backBarButtonItem
программная установка не работает, но установка через раскадровку работает.
backBarButtonItem
программно у меня работает в iOS 9.
Реализовать можно 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
это nil
по умолчанию , и это влияет на следующий толкнул контроллер, так что вы просто установить его для всех контроллеров
Установка заголовка кнопки возврата на @""
или nil
не будет работать. Вам нужно сделать всю кнопку пустой (без заголовка или изображения):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Это должно быть сделано на контроллере представления, который находится поверх вашего контроллера представления в стеке навигации (то есть, откуда вы переходите к своему VC через pushViewController
метод)
Другое решение этой проблемы для ситуаций, когда у вас много контроллеров представления, - это использовать UIAppearance
прокси для эффективного скрытия текста заголовка кнопки возврата, например:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Это решение отобразит текст в виде крошечной прозрачной точки, аналогично ручной установке заголовка кнопки «Назад» @" "
, за исключением того, что оно влияет на все кнопки панели навигации.
Я не предлагаю это как общее решение проблемы, потому что это влияет на все кнопки панели навигации. Он меняет парадигму, так что вы выбираете, когда показывать заголовки кнопок, а не когда скрывать заголовки.
Чтобы выбрать, когда показывать заголовки, либо вручную восстановите атрибуты текста заголовка по мере необходимости, либо создайте специализированный подкласс, UIBarButtonItem
который делает то же самое (возможно, с другим UIAppearance
прокси).
Если у вас есть приложение, в котором нужно скрыть большинство заголовков кнопок «Назад», и только несколько (или ни одной) кнопок навигации являются системными кнопками с заголовками, это может быть для вас!
(Примечание: изменение размера шрифта необходимо, даже если цвет текста четкий, чтобы длинные заголовки не вызывали смещения заголовка центральной панели навигации)
Добавьте следующий код в viewDidLoad или loadView
self.navigationController.navigationBar.topItem.title = @"";
Я тестировал его на iPhone и iPad с iOS 9
Вы можете добавить эту категорию Objective-C, чтобы все кнопки «Назад», созданные контроллером навигации, не имели текста. Я только что добавил его в свой файл 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 - (Я не знаю, как заставить это расширение работать со Swift, у него были странные ошибки. Приветствуются правки, чтобы добавить версию Swift)
override
это сделать в быстром темпе. Очень интересный вопрос
Я пробовал несколько выше и ниже, но они не работали. Это сработало для меня:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Единственное, что работает без побочных эффектов, - это создание настраиваемой кнопки возврата. Пока вы не предоставляете настраиваемое действие, работает даже жест слайда.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
К сожалению, если вы хотите, чтобы все кнопки возврата не имели заголовков, вам необходимо настроить эту настраиваемую кнопку возврата во всех контроллерах представления: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Очень важно установить в качестве заголовка пробел, а не пустую строку.
чтобы программно удалить текст из кнопки возврата, используется ниже Код, это будет работать с xcode7 и выше.
self.navigationController.navigationBar.topItem.title = @ "";
или
manualLy в раскадровках, выберите панель навигации на контроллере представления и вставьте "" в текст кнопки возврата.
это будет работать. Спасибо
self.navigationController?.navigationBar.topItem?.title = " "
в Xcode 9 и работал!
Текущий ответ не работал. Я хотел полностью удалить заголовок , но текст «назад» никуда не делся.
Вернитесь к предыдущему контроллеру представления и установите его свойство title:
self.title = @" ";
ТОЛЬКО работает, когда предыдущий контроллер представления не имеет заголовка
@""
.
Альтернативный способ - использовать собственный класс 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()
}
}
То есть при этом удаляются заглавия всего проекта. Просто установите собственный класс для UINavigationController.
Установите заголовок предыдущего VC в "" строку с пробелом. а заголовок с кнопкой возврата будет заменен строкой с одним пробелом.
Self.title = " "
На Back нажмите еще раз, чтобы вернуть заголовок к исходному в viewWillAppear.
Используйте обычай, NavigationController
который отменяетpushViewController
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)
}
}
Уже много ответов, вот мои два цента по этой теме. Я нашел этот подход действительно надежным. Вам просто нужно поместить это в viewController перед переходом.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Я перепробовал все в этом посте. Единственное рабочее решение - это @ VoidLess's
Вот тот же ответ, но более полный
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)
}
}
Это мое разрешение для iOS11, я меняю внешний вид UIBarButtonItem в applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Вы не можете изменить смещение Y, потому что оно изменит положение кнопки задней панели также в iOS11, но это нормально в iOS10 и ниже.
В Swift3,
Если вы установите глобальную настройку
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 Вы можете сделать это, реализовав метод делегата 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
}
Для тех, кто хочет глобально скрыть заголовок кнопки возврата.
Вы можете Swizzle viewDidLoad
из UIViewController
так.
+ (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);
}
}
Использование:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Если вы ориентируетесь на iOS 13 и новее, вы можете использовать этот новый API, чтобы глобально скрыть заголовок кнопки «Назад» .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Я боролся с этим, потому что у меня был собственный контроллер навигации. Я смог удалить текст заднего элемента во всех контроллерах представления с помощью этого кода в моем пользовательском классе контроллера навигации.
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Это удаляет все заголовки задних элементов с помощью этого настраиваемого контроллера навигации.
В iOS 11 мы обнаружили, что установка UIBarButtonItem
очень маленького значения шрифта / цвета текста внешнего вида или прозрачного цвета приведет к исчезновению другого элемента панели (система больше не учитывает класс элемента UIBarButton, она преобразует его в a _UIModernBarButton
). Также установка смещения обратного текста за пределы экрана приведет к миганию во время интерактивного всплывающего окна.
Итак, мы взяли 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];
}
Обратный текст берется из , последнего контроллера просмотра navigationItem.title
и navigationItem.title
устанавливается автоматически self.title
. Самый простой способ решить проблему - это крючок setTitle:
, убедитесьnavigationItem.title = @""
Поместите этот код по AppDelegate.m
желанию, и все будет в порядке。
[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];
Более подробная информация на https://www.jianshu.com/p/071bc50f1475 (Simple Chinease).
XCode 11.5 Swift 5
Очень простой - хотя, возможно, немного хакерский - способ сделать это программно, если вам не нужна настраиваемая кнопка возврата, - это установить размер шрифта равным нулю в контроллере представления, который вы помещаете в стек, вызывая что-то вроде этого из 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
}
Наконец-то нашли идеальное решение, чтобы скрыть задний текст по умолчанию во всем приложении.
Просто добавьте одно прозрачное изображение и добавьте следующий код в свой AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Следующий метод работает на iOS 11 и не дает сбоев в других версиях iOS. Это может привести к отклонению вашего приложения в обзоре App Store, поскольку и UIModernBarButton, и UIBackButtonContainerView являются частными API. Поместите в 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)
}
Это из моего кода xamarin.forms, класс происходит от NavigationRenderer
NavigationBar.Items.FirstOrDefault().BackBarButtonItem = new UIBarButtonItem( "", UIBarButtonItemStyle.Plain, null);