Удаление текста заголовка 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];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;


то, что я хотел достижение-это что-то вроде кнопок Назад, найденных в музыкальном приложении iOS 7, в котором был только один шеврон.



спасибо.

546   30  

30 ответов:

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

затем вы можете удалить заголовок элемента кнопки Назад.

Если вы используете раскадровку, вы можете установить кнопку инспектора атрибутов навигации назад с пробелом.

чтобы установить заголовок кнопки Назад для контроллера вида без изменения его названия используйте:

Цель-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)

чтобы быть ясным, это делается на контроллере вида, который вы увидите, если нажмете кнопку "Назад". т. е. вместо того, чтобы видеть "init. Тогда вы не получите никаких проблем не показывает когда вы смотрите на сам контроллер вида.

если вы используете раскадровки вы можете пойти к Attributes Inspector из ViewController Navigation Item (нажмите на кнопку Navigation Bar) и Back Button свойство "" (один пробел). Это установит заголовок кнопки "Назад" на один пробел, оставив шеврон видимым. Не нужно возиться с кодом.

example image

обратите внимание, что это набор Back Button title для кнопки Назад, которая будет переходить к этому контроллеру вида от того, который был нажат на него сверху, а не для Back Button что будет отображаться внутри этого контроллера!

это работает для меня, чтобы отобразить только "назад" шеврон без текста:

self.navigationController.navigationBar.topItem.title = @"";

установите это свойство в viewDidLoad контроллера вида, представляющего панель навигации, и он будет делать трюк.

примечание: Я только протестировал его в iOS 7, что находится в пределах вопроса.

когда вы устанавливаете заголовок кнопки, используйте @ "" вместо@"".

-- EDIT--

что-нибудь меняется, когда вы пробуете другие строки? Я сам успешно использую следующий код:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString-это переменная, которая имеет значение @ "" или @ "Back", в зависимости от того, нахожусь ли я на iOS 7 или более низкой версии.

следует отметить, что этот код не находится в контроллере для страницы, для которой я хочу настроить кнопку "Назад". Это на самом деле в контроллер перед ним в навигационном стеке.

enter image description here

иногда полезно видеть вещи в контексте. Вот минимальный проект, который скрывает текст "назад", но все еще показывает стрелку.

раскадровка

enter image description here

существует сегмент show от кнопки "Показать второй контроллер вида" до второго контроллера вида.

Я также добавил навигационный элемент во второй контроллер вида, чтобы он имел заголовок. Это необязательно. Это не влияет на кнопку Назад.

код

FirstViewController.Свифт

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.Свифт

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

альтернативный метод (только IB, без кода)

на раскадровке выберите пункт навигации для первый контроллер вида (не второй). Просто введите пробел для кнопки Назад текст.

enter image description here

self.navigationController.navigationBar.topItem.title = @"";

на iOS7 Apple представила два новых свойства для UINavigationBar: 'backIndicatorTransitionMaskImage'и ' backIndicatorImage'.

просто позвонив один раз:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

он будет отображать пользовательское изображение вместо стандартного шевронного глифа, наследуя оттенок цвета keyWindow.

и для удаления заголовка я предложу ответ Камароса. Не забудьте вызвать этот код на контроллере вида, который толкает ваш новый контроллер вида. удаление текст заголовка iOS UIBarButtonItem

У меня не было большого успеха с предоставленными ответами, но я нашел действительно простую работу. В раскадровке вы можете нажать на навигационный элемент вашего UIViewController и установить текст кнопки Назад. Я установил его в одно "" пространство, и это дало мне поведение, которое я искал.enter image description here

это сработало для меня в iOS10. Чтобы вызвать этот метод viewDidLoad контроллера представления.

self.navigationController?.navigationBar.topItem?.title = ""

простое решение этой проблемы, работая на 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 = @" ";

поскольку ваше представление заголовка является пользовательским, оно не будет перезаписано при перемещении обратно в стек навигации.

на самом деле вы можете сделать это только один трюк:

переопределить UINavigationBar класс и добавить эту строку кода:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

затем инициализировать UINavigationController С помощью этого пользовательского класса UINavigationBar.. так далее. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

надеюсь, что это помогает

в методе prepareForSegue: вашего первого ViewController вы устанавливаете заголовок этого представления в@"", Поэтому при нажатии следующего представления он отобразит предыдущий заголовок ViewController, который будет@"".

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

единственная проблема заключается в том, что при нажатии кнопки "Назад" ваш предыдущий вид не будет иметь названия, поэтому вы можете добавить его снова на viewWillAppear:

- (void)viewWillAppear:(BOOL)animated{
    self.navigationItem.title = @"First View Title";
}

мне не очень нравится это решение, но оно работает, и я не нашел другого способа сделать оно.

я смог собрать что-то вместе, используя ответ Донналеи. Вот как решение появляется в моем подклассе 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
    }
}

проблема с исходным ответом заключается в том, что он удаляет заголовок из контроллера, когда вы возвращаетесь к нему. Попытка сбросить заголовок в viewWillDisappear слишком поздно в процессе перехода; это приводит к тому, что заголовок защелкивается, а не анимируется красиво. Однако willMoveToParentViewController происходит раньше и позволяет для правильного поведения.

предостережение: я только проверил это с помощью обычного UINavigationController push / pop. В других ситуациях может возникнуть дополнительное неожиданное поведение.

Не ответы помогли мне. Но трюк сделал-я просто очистил заголовок контроллера вида, который нажал (где кнопка "Назад" будет), прежде чем нажать его.

поэтому, когда предыдущий вид не имеет заголовка, на iOS 7 кнопка "Назад" будет иметь только стрелку, без текста.

On viewWillAppear из толкающего вида я вернул исходный заголовок.

    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];

это использование подкласса 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
[[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];

SWIFT 3

navigationController?.navigationBar.topItem?.title = ""

скрыть назад Название кнопки панели навигации

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

вот что я делаю мне, что проще удалить название кнопки Назад

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

вы также можете использовать это:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

это работает для меня

case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

идеальное решение в глобальном масштабе

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
}

Я создаю пользовательский класс для UINavigationController и применить его ко всем навигационным контроллерам в моем приложении. Внутри этого обычая UINavigationController класс I установить 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 так что заголовок всегда обновляется непосредственно перед появлением представления (в случае, если он удаляется такими трюками).

Если вы используете пользовательский вид вместо UINavigationBar и вы застряли с кнопкой назад, то вы должны сделать немного работы, которая чувствует себя немного неуклюжим.

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

похоже, что если он не будет представлен, то независимо от того, что он попытается показать заголовок, это означает, что он показан, а затем скрыт, прежде чем он будет нарисован и решит проблему.

extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

в iOS 11 вы можете использовать следующий код, чтобы скрыть кнопку Назад название:

Swift:

UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)

этот код не удаляет заголовок из панели навигации, а просто делает его прозрачным, чтобы кнопка "назад" по-прежнему занимала место для заголовка. Если вам нужно иметь больше места для заголовка контроллера вида, то вам нужно использовать другое решение.

Это лучшее решение.

другое решение опасно, потому что это хак.

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)
    }
}

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
    }

Comments

    Ничего не найдено.