Как настроить цвет текста кнопки "Назад" в представлении заголовка UINavigationController?

Я использую пользовательский tintColor на моей навигационной панели UINavigationController, и поскольку цвет настолько светлый, мне нужно использовать текст темного цвета. Относительно легко поменять вид заголовка и пользовательские кнопки, которые я добавил с правой стороны, но я не могу заставить пользовательский вид встать на кнопку "Назад". Это то, что я сейчас пытаюсь сделать:

    UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectZero];

    [backLabel setFont:[UIFont fontWithName:[[UIFont fontNamesForFamilyName:@"Arial Rounded MT Bold"] objectAtIndex:0] size:24.0]];
    [backLabel setTextColor:[UIColor blackColor]];
    [backLabel setShadowColor:[UIColor clearColor]];

    [backLabel setText:[aCategory displayName]];
    [backLabel sizeToFit];
    [backLabel setBackgroundColor:[UIColor clearColor]];

    UIBarButtonItem *temporaryBarButtonItem=[[UIBarButtonItem alloc] initWithCustomView:backLabel];

    temporaryBarButtonItem.customView = backLabel;
    [backLabel release];

    self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
    [temporaryBarButtonItem release];]

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

Ответ 1

Нет официального способа сделать это. Два метода, о которых я мог думать, следующие:

  • перейдите в дерево представлений, чтобы найти существующую кнопку "Назад", и вручную установите цвет текста. Это, вероятно, не очень хорошая идея, поскольку она хрупка, и кнопка может даже не иметь настраиваемого свойства textColor.

  • создайте свою собственную кнопку возврата (т.е. своим собственным изображением) и установите ее цвет. Это то, что мы делаем в ряде мест. Это немного больше работы, но результаты именно то, что вы хотите.

Ответ 2

Это работает, решает исходный вопрос (смените кнопку Navbar BACK - и никаких кнопок на других панелях инструментов, никаких кнопок на вкладках и т.д.):

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], UITextAttributeTextColor,nil]
         forState:UIControlStateNormal];

Ответ 3

Я пробовал перемещаться, чтобы установить текст, но он заканчивается на UINavigationItemButtonView, который, как представляется, просто рисует напрямую. Невозможно установить цвет.

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

UIBarButtonItem * backItem = [[UIBarButtonItem alloc] initWithImage:backImage style:UIBarButtonItemStylePlain target:nil action:nil];
navItem.backBarButtonItem = backItem;
[backItem release];

Ответ 4

Скотчев правильный. В предыдущих версиях SDK они использовали отдельные экземпляры UIButton, которые позволяли настраивать, перемещая иерархию subview. Это невозможно.

Ответ 5

@DrMickeyLauer Итерирование иерархии для установки цвета текста возможно в моей среде разработки.
Когда вы заполняете свои UINavigationBar's левое и правое представления, ваш UINavigationBar будет иметь UIButtons как subviews. Если вы получаете фантазии и родительские UIToolbars в своей навигационной панели, вы можете выполнять итерацию через свой navBar.items, проверяя UINavigationItems (через isKindOfClass:). Эти элементы навигации имеют левый и правый элементы массива. Эти массивы содержат (помимо всего прочего) панель инструментов (ы), которую вы помещаете в панель навигации влево и вправо. Эти левые и правые массивы дают вам доступ к панели инструментов UIBarButtonItems. Затем вы можете вызвать setTitleTextAttributes на UIBarButtonItems, чтобы установить цвета текста и тени.

Но, как заявил Бен Готлиб, это хрупкий подход. Это заставляет вас задаться вопросом, изменится ли структура навигационной панели в будущем.