iOS 7 UIBarButton кнопка со стрелкой назад цвет стрелки


172

Я пытаюсь поменять кнопку назад стрелка

введите описание изображения здесь

В настоящее время я использую следующее для управления размером текста, а также цвет текста на кнопке назад:

[[UIBarButtonItem appearance] setTitleTextAttributes:
  [NSDictionary dictionaryWithObjectsAndKeys:
    [UIColor whiteColor], UITextAttributeTextColor,
    [UIFont boldSystemFontOfSize:16.0f], UITextAttributeFont,
    [UIColor darkGrayColor], UITextAttributeTextShadowColor,
    [NSValue valueWithCGSize:CGSizeMake(0.0, -1.0)], UITextAttributeTextShadowOffset,
  nil] forState:UIControlStateNormal];

но если я хочу изменить только цвет стрелки для кнопки «назад», что мне делать?


Нашли ли вы какое-либо решение изменить цвет стрелки для кнопки назад?
— OnkarK

1
@OMK Я закончил тем, что изменил свой infolistproperty NavBarColor, чтобы заставить его работать, и затем установил фактический цвет navbar в другой цвет. Я не уверен, что происходит, но это решение сработало для меня
— Кевинл

1
Поведение некоторых свойств UINavigationBarизменилось по сравнению с iOS 7. Посмотрите на ответ, чтобы увидеть влияние некоторых других свойств .
— Бхавин

пожалуйста, помогите с этой проблемой: stackoverflow.com/questions/29923813/…
— MIloš Kresović

Ответы:


438

Чтобы изменить цвет кнопки «Назад» для определенного контроллера навигации *:

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

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

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

И для хорошей меры, в быстром (спасибо Джей Маю в комментариях):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()

3
Это будет применяться только ко всему приложению, если вы используете один и тот же контроллер навигации для всего приложения. Я действительно рекомендую предложение Барта.
— Кайл Клегг

1
Я обновил свой ответ запиской о нескольких контроллерах навигации. Я по-прежнему не согласен с тем, что предложение Барта является «правильным» ответом, поскольку при настройке цвета оттенка всего приложения возникает множество других побочных эффектов. Плюс, оригинальный вопрос не спрашивал, как создать тему для всего приложения, а только спрашивал, как создать кнопку «Назад».
— DiscDev

1
Это, кажется, не устанавливает цвет заднего шеврона.
— jcampbell1

2
@ jcampbell1 - я успешно использую это в нескольких своих приложениях ... возможно, вы не читали предостережение о нескольких UINavigationControllers.
— DiscDev

7
для быстрыхUINavigationBar.appearance().tintColor = UIColor.whiteColor()
— Джей Майю

57

Вы должны установить оттенок всего приложения.

self.window.tintColor = [UIColor redColor];

Или в Swift 3:

self.window?.tintColor = UIColor.blue

Источник: Руководство по переходу с iOS 7


4
Если вы хотите установить цвет шеврона кнопки «Назад» (а не всего приложения), как указано в исходном вопросе, это неправильный ответ. Смотрите мой ответ здесь для правильного ответа: stackoverflow.com/a/18809412/1103584
— DiscDev

Я использовал это в своем делегате приложения, чтобы изменить свои кнопки назад на черный. Поместите в метод applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
— Марк Уотсон,

Это не может работать на iOS 6. Кто-нибудь знает, что делать?
— Gavjr

1
Это заставило его повлиять на tintColor всего приложения, которое включает в себя любой UIActivityViewController (для совместного использования) и MFMailComposeViewController (для отправки электронной почты). В этих диалогах предполагается, что tintColor не был изменен с .... и может привести к некоторым уродливым цветным взаимодействиям.
— Майк Ламберт

Это изменяет цвет оттенка многих других объектов, таких как мигающий курсор в UITextField. Определенно не рекомендуется.
— Охотник Монах

55

Вы можете установить цвет на панели навигации всего приложения, используя метод

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions{
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}

23

Таким способом можно изменить только цвет стрелки (не цвет заголовка кнопки назад):

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

Панель навигации содержит подпредставление типа _UINavigationBarBackIndicatorView (последний элемент в массиве подпредставлений), которое представляет стрелку.

Результатом является навигационная панель с разными цветами стрелки «Назад» и заголовка кнопки «Назад».


4
В зависимости от порядка подпредставлений системных представлений это плохая идея.
— Гленн Мейнард

2
это работало, когда установка self.navigationController.navigationBar.tintColor не работала.
— Rich Fox

@GlennMaynard Вы правы - лучший способ реализовать это - выполнить итерацию массива подпредставлений, возвращаемых self.navigationController.navigationBar.subviewsдо тех пор, пока не будет найдена кнопка «Назад».
— Эван R

@EvanR, в то время как решение selmad сработало для меня, перебор массива подпредставлений не сработал (что я попробовал сначала, потому что согласен с вами, что было бы разумно сделать это) Если это работает для вас - пожалуйста, добавьте пример. Спасибо.
— jungledev


11

Внутри rootViewController, который инициализирует navigationController, я поместил этот код в свой метод viewDidAppear:

//set back button color
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor,nil] forState:UIControlStateNormal];
//set back button arrow color
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];

2
UITextAttributeTextColor устарела в iOS 7 - используйте NSForegroundColorAttributeName
— amergin

7

В iOS 6 tintColor окрашивал фон панелей навигации, панелей вкладок, панелей инструментов, панелей поиска и панелей областей. Чтобы подкрасить фон панели в iOS 7, используйте вместо этого свойство barTintColor.

iOS 7 Design Resources Руководство по переходу с пользовательского интерфейса iOS 7


2
Это тот самый! ... положить его в приложение делегата. Работает как шарм! window.tintColor = [UIColor blackColor]; // Я хотел черного
— Марк Уотсон,

6

Вы можете установить tintColorсвойство для кнопки (или элемента кнопки панели) или представления контроллера представления. По умолчанию свойство будет наследовать оттенок от родительского представления вплоть до верхнего уровня UIWindowвашего приложения.


1
Спасибо за ответ. Тем не менее, он работает немного по-другому на iOS 7. Мой старый код использовал tintColor, но iOS 7, похоже, не очень-то это нравится. Я
— решил

Смотрите мой ответ для отдельного примера того, как это сделать: stackoverflow.com/a/18809412/1103584
— DiscDev

5

Я должен был использовать оба:

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

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor whiteColor]];

И работает на меня, спасибо за всех!


5
UINavigationBar *nbar = self.navigationController.navigationBar;

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
   //iOS 7
   nbar.barTintColor = [UIColor blueColor]; // bar color
   //or custom color 
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

   nbar.navigationBar.translucent = NO;

   nbar.tintColor = [UIColor blueColor]; //bar button item color

} else {
   //ios 4,5,6
   nbar.tintColor = [UIColor whiteColor];
   //or custom color
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

}

Отлично. Это помогло мне. Спасибо
— Йогеш Лолусаре

4

Обновление Swift 3

navigationController?.navigationItem.rightBarButtonItem?.tintColor = UIColor.yellow
navigationController?.navigationBar.tintColor = UIColor.red
navigationController?.navigationBar.barTintColor = UIColor.gray
navigationController?.navigationBar.titleTextAttributes =  [NSForegroundColorAttributeName: UIColor.blue]

Результат: введите описание изображения здесь


3

Просто чтобы изменить NavigationBarцвет, вы можете установить цвет оттенка, как показано ниже.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

Это не повлияет на цвет оттенка в iOS 7. Согласно документации: «Настройка свойства tintColor с помощью API прокси внешнего вида не поддерживается в iOS 7». ссылка
— bachonk

3

В случае, если вы создаете пользовательскую кнопку возврата на основе UIButton с изображением стрелки, здесь приведен фрагмент подкласса. Используя его, вы можете создать кнопку в коде или просто назначить класс в Интерфейсном Разработчике для любой UIButton. Стрелка назад Изображение будет добавлено автоматически и закрашено цветом текста.

@interface UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color;

@end


@implementation UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height);

    if (UIGraphicsBeginImageContextWithOptions) {
        CGFloat imageScale = 1.0f;
        if ([self respondsToSelector:@selector(scale)])
            imageScale = self.scale;
        UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale);
    }
    else {
        UIGraphicsBeginImageContext(self.size);
    }

    [self drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

@end




#import "iOS7backButton.h"

@implementation iOS7BackButton

-(void)awakeFromNib
{
    [super awakeFromNib];

    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:self.titleLabel.textColor];
    [self setImage:backBtnImage forState:UIControlStateNormal];
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
    [self setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];


}


+ (UIButton*) buttonWithTitle:(NSString*)btnTitle andTintColor:(UIColor*)color {
    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIButton *backBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:color];
    [backBtn setImage:backBtnImage forState:UIControlStateNormal];
    [backBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, is6?5:-5, 0, 0)];
    [backBtn setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];
    [backBtn setTitle:btnTitle forState:UIControlStateNormal];
    [backBtn setTitleColor:color /*#007aff*/ forState:UIControlStateNormal];

    return backBtn;
}

@end

изображение кнопки назад @ 2x


3

Если вы хотите изменить только Back Arrow BUT во всем приложении, сделайте следующее:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];

Есть шанс, что вас откажут от магазина приложений
— Лука,

@ Люк, я успешно использовал его несколько раз. Нет отклонений. Но да, шанс все еще существует.
— Оркенштейн

Это все еще вероятно, что это сломается в будущей версии iOS
— Lope

1
@ Надеюсь, да, почему бы и нет. Я не ищу серебряную пулю.
— Оркенштейн

Перебор подпредставлений на iOS 10.1 показывает, что это все еще имя класса, но настройка его внешнего вида, как показано здесь, для меня не имеет никакого эффекта.
— arlomedia

2

В iOS 7 вы можете поместить следующую строку кода application:didFinishLaunchingWithOptions:в ваш AppDelegate.mфайл:

[[UINavigationBar appearance] setTintColor:myColor];

Установите myColorцвет, который вы хотите, чтобы кнопка «Назад» была во всем приложении. Нет необходимости помещать его в каждый файл.


0

Swift 2.0: раскраска панели навигации и кнопок

navigationController?.navigationBar.barTintColor = UIColor.blueColor()
navigationController?.navigationBar.tintColor = UIColor.whiteColor()
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

0

В Swift 3, чтобы изменить цвет стрелки кнопки UIBarButton назад

self.navigationController?.navigationBar.tintColor = UIColor.black
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.