Удаление текста заголовка iOS UIBarButtonItem
Я хотел бы удалить текст из кнопки "Назад" UIBarButtonItem
, оставив только синий шеврон на панели навигации. Имейте в виду, что я разрабатываю для iOS 7. Я пробовал несколько методов, включая, но не ограничиваясь:
Это метод изображения, который мне не понравился (изображение выглядело неуместным):
UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;
Другой метод, который я пробовал, был таким, который просто не работал (ничего не отображалось):
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
[email protected]"";
self.navigationItem.leftBarButtonItem=barBtn;
То, что я хотел достичь, - это что-то вроде кнопок на задней панели, найденных в приложении iOS 7 Music, в котором был показан только один шеврон.
Спасибо.
Ответы
Ответ 1
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
forBarMetrics:UIBarMetricsDefault];
Затем вы можете удалить заголовок элемента "Назад".
Если вы используете Storyboard, вы можете установить навигационную атрибуту контрольной кнопки Back Button с пробелом.
Ответ 2
Чтобы установить заголовок кнопки "Назад" для контроллера вида без изменения его названия, используйте:
Objective-C:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
Swift:
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Чтобы быть ясным, это делается на контроллере представления, который вы увидите, если вы нажмете кнопку "Назад"., а не видеть "< Настройки" вы хотите просто увидеть '<' то на вашем SettingsViewController вы поместите это в свой init
. Тогда вы не получите никаких проблем с названием, которое не отображается, когда вы смотрите на сам контроллер представления.
Ответ 3
Если вы используете раскадровки вы можете перейти к Attributes Inspector
в ViewController Navigation Item
(нажмите на Navigation Bar
) и установить Back Button
свойство "" (один символ пробела). Это установит заголовок кнопки "Назад" на один пробел, оставляя шеврон видимым. Не нужно связываться с кодом.
![example image]()
Обратите внимание, что это установит заголовок Back Button
"Назад", которая будет переходить к этому контроллеру вида из той, которая была нажата поверх него, а не для Back Button
которая будет отображаться внутри этого контроллера!
Ответ 4
Это работает для меня, чтобы отобразить только "назад" шеврон без текста:
self.navigationController.navigationBar.topItem.title = @"";
Задайте это свойство в viewDidLoad
контроллера просмотра, представляющего панель навигации, и это сделает трюк.
Примечание. Я тестировал его только в iOS 7, который находится в пределах объема вопроса.
Ответ 5
Когда вы устанавливаете заголовок кнопки, используйте @ "вместо @" ".
- EDIT -
Что-нибудь меняется, когда вы пытаетесь использовать другие строки? Я сам успешно использую следующий код:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
backString - это переменная, которая установлена на @ "или @" Назад ", в зависимости от того, включен ли я на iOS 7 или более низкую версию.
Следует отметить, что этот код не находится в контроллере для страницы, на которой я хочу настроить кнопку "Назад". Он фактически находится в контроллере перед ним в стеке навигации.
Ответ 6
![enter image description here]()
Иногда полезно видеть вещи в контексте. Вот минимальный проект, который скрывает текст "назад", но показывает стрелку.
Раскадровка
![enter image description here]()
От кнопки "Показать контроллер второго вида" происходит переход к второму контроллеру представления.
Я также добавил элемент навигации ко второму контроллеру представления, чтобы он имел заголовок. Это необязательно. Это не влияет на кнопку назад.
Код
FirstViewController.swift
import UIKit
class FirstViewController: UIViewController {
@IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {
// hide the back button text
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
// Nothing at all needed here
}
Альтернативный метод (только IB, без кода)
На раскадровке выберите элемент навигации для первого контроллера представления (а не второго). Просто введите пробел для текста кнопки "Назад".
![enter image description here]()
Ответ 7
self.navigationController.navigationBar.topItem.title = @"";
Ответ 8
На iOS7 Apple представила два новых свойства для UINavigationBar, 'backIndicatorTransitionMaskImage' и 'backIndicatorImage'.
Просто позвонив один раз:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];
Он отобразит нестандартное изображение вместо символа шеврона по умолчанию, наследуя цвет оттенка keyWindow.
И для удаления названия я предлагаю ответить Камаросу. Не забудьте вызвать этот код на контроллере представления, который нажимает ваш новый контроллер просмотра. Удаление текста заголовка iOS UIBarButtonItem
Ответ 9
У меня не было большого успеха с предоставленными ответами, но я действительно нашел очень простую работу. В своем раскадровке вы можете нажать на свой элемент навигации UIViewController и установить текст кнопки "Назад". Я установил его в одно "пространство", и он дал мне поведение, которое я искал. ![enter image description here]()
Ответ 10
Это работало для меня в iOS10. Вызовите это из viewDidLoad контроллера вида.
self.navigationController?.navigationBar.topItem?.title = ""
Ответ 11
Простым решением этой проблемы, работающей как с iOS7, так и с 6, является установка пользовательского заголовка в viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.text = self.title;
titleLabel.backgroundColor = [UIColor clearColor];
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;
}
Затем, в viewWillAppear: вы можете безопасно позвонить
self.navigationController.navigationBar.topItem.title = @" ";
Поскольку ваше представление заголовка является настраиваемым, оно не будет перезаписано при перемещении в стеке навигации.
Ответ 12
На самом деле вы можете сделать это с помощью всего лишь одного трюка:
Заменить класс UINavigationBar
и добавить эту строку кода:
- (void)layoutSubviews{
self.backItem.title = @"";
[super layoutSubviews];
}
Затем инициализируйте свой UINavigationController
с помощью этого пользовательского класса UINavigationBar и т.д. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];
Надеюсь, что это поможет
Ответ 13
В методе prepareForSegue: вашего первого ViewController вы задаете заголовок вида @ ", поэтому при следующем нажатии на него будет отображаться предыдущий заголовок ViewController, который будет @" ".
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
Единственная проблема заключается в том, что когда вы нажимаете кнопку "Назад", ваш предыдущий вид не будет иметь заголовок, поэтому вы можете добавить его снова в viewWillAppear:
- (void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
Мне не очень нравится это решение, но оно работает, и я не нашел другого способа сделать это.
Ответ 14
Я смог сжечь что-то вместе, используя ответ DonnaLea. Так появляется решение в моем подклассе UIViewController:
var backItemTitle:String?
override func viewDidLoad() {
super.viewDidLoad()
//store the original title
backItemTitle = self.navigationController?.navigationBar.topItem?.title
//remove the title for the back button
navigationController?.navigationBar.topItem?.title = ""
}
override func willMoveToParentViewController(parent: UIViewController?) {
super.willMoveToParentViewController(parent)
if parent == nil {
//restore the orignal title
navigationController?.navigationBar.backItem?.title = backItemTitle
}
}
Проблема с исходным ответом заключается в том, что он удаляет заголовок с контроллера, когда вы возвращаетесь к нему. Попытка reset заголовок в viewWillDisappear слишком поздно в процессе перехода; Это заставляет заголовок возвращаться, а не анимировать. Однако willMoveToParentViewController происходит раньше и допускает правильное поведение.
Предостережение: я тестировал это только с обычным UINavigationController push/pop. В других ситуациях может возникнуть дополнительное неожиданное поведение.
Ответ 15
SWIFT 3
navigationController?.navigationBar.topItem?.title = ""
Ответ 16
Не ответы помогли мне. Но трюк сделал - я только что очистил заголовок контроллера вида, который нажал (где кнопка назад), прежде чем нажимать его.
Итак, если предыдущий вид не имеет названия, на iOS 7 на задней панели будет только стрелка без текста.
В viewWillAppear
нажимающего представления я вернул исходное название.
Ответ 17
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
У меня была такая же проблема, и я сделал это так.
- EDIT -
Это решение, когда вы действительно хотите удалить текст заголовка всего UIBarbuttonItem. Если вы хотите удалить заголовок элемента кнопки на задней панели, нет простого простого решения. В моем случае, поскольку у меня только несколько UIBarButtonItems, которые должны отображать текст заголовка, я просто изменил те ключевые слова titleTextAttributes. Если вы хотите более конкретно использовать приведенный ниже код, который будет изменять только кнопки панели навигации:
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor clearColor],UITextAttributeTextColor,
nil];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
forState:UIControlStateNormal];
Ответ 18
Это использование подкласса navigationController
удаляет "Назад".
Я использую это, чтобы удалить его, навсегда через приложение.
//.h
@interface OPCustomNavigationController : UINavigationController
@end
//.m
@implementation OPCustomNavigationController
- (void)awakeFromNib
{
[self backButtonUIOverride:YES];
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[self backButtonUIOverride:NO];
[super pushViewController:viewController animated:animated];
}
- (void)backButtonUIOverride:(BOOL)isRoot
{
if (!self.viewControllers.count)
return;
UIViewController *viewController;
if (isRoot)
{
viewController = self.viewControllers.firstObject;
}
else
{
int previousIndex = self.viewControllers.count - 1;
viewController = [self.viewControllers objectAtIndex:previousIndex];
}
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
}
@end
Ответ 19
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
NSFontAttributeName:[UIFont systemFontOfSize:1]}
forState:UIControlStateNormal];
Ответ 20
Скрыть кнопку "Назад" Название панели навигации
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Ответ 21
Вот что я делаю, что проще удалить название кнопки назад
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar?.backItem?.title = ""
}
Ответ 22
Swift 3.1 Вы можете сделать это, реализовав метод делегата UINavigationController. Он будет скрывать только заголовок с кнопкой "назад", мы все равно получим изображение стрелки назад и функциональность по умолчанию.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Ответ 23
Вы также можете использовать это:
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];
Это работает для меня
Ответ 24
case : <Back as <
override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
}
Ответ 25
Идеальное решение во всем мире
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
}
Ответ 26
Я создаю пользовательский класс для UINavigationController
и применяю его ко всем навигационным контроллерам в своем приложении. Внутри этого пользовательского класса UINavigationController
я устанавливаю делегат UINavigationBar
на self
после загрузки представления.
- (void)viewDidLoad {
self.navigationBar.delegate = self;
}
Затем я реализую метод делегата:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {
// This will clear the title of the previous view controller
// so the back button is always just a back chevron without a title
if (self.viewControllers.count > 1) {
UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
previousViewController.title = @"";
}
return YES;
}
Таким образом, я просто назначаю свой собственный класс всем моим контроллерам навигации, и он очищает заголовок от всех кнопок назад. И просто для ясности я всегда устанавливал заголовок для всех моих других контроллеров представления внутри viewWillAppear
, чтобы заголовок всегда обновлялся непосредственно перед представлением (в случае его удаления с помощью трюков, подобных этому).
Ответ 27
Если вы похожи на меня, вы используете пользовательский вид вместо UINavigationBar
, и вы застряли с кнопкой "назад", тогда вам нужно немного поработать, чувствуя себя немного неуклюже.
[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];
Кажется, что если он не будет представлен, то независимо от того, что он попробует показать заголовок, это означает, что он показывается, затем скрыт перед тем, как он нарисован, и решает проблему.
Ответ 28
extension UIViewController{
func hideBackButton(){
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
Ответ 29
Это лучшее решение.
Другое решение опасно, потому что это взломать.
extension UINavigationController {
func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
pushViewController(viewController, animated: animated)
}
}
Ответ 30
Я не мог заставить его работать, используя ответ Гуто Араухо navigationBar.topItem.title = @"";
Однако я смог получить желаемый эффект, установив self.title = @""
в методе init
моего контроллера представления. (Установка в init
важна, viewDidLoad
не будет работать.)