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

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

kevinl
источник
Нашли ли вы какое-либо решение изменить цвет стрелки для кнопки назад?
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()
DiscDev
источник
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 (последний элемент в массиве подпредставлений), которое представляет стрелку.

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

selmad
источник
4
В зависимости от порядка подпредставлений системных представлений это плохая идея.
Гленн Мейнард
2
это работало, когда установка self.navigationController.navigationBar.tintColor не работала.
Rich Fox
@GlennMaynard Вы правы - лучший способ реализовать это - выполнить итерацию массива подпредставлений, возвращаемых self.navigationController.navigationBar.subviewsдо тех пор, пока не будет найдена кнопка «Назад».
Эван R
@EvanR, в то время как решение selmad сработало для меня, перебор массива подпредставлений не сработал (что я попробовал сначала, потому что согласен с вами, что было бы разумно сделать это) Если это работает для вас - пожалуйста, добавьте пример. Спасибо.
jungledev
22

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

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

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

ИСПОЛЬЗОВАНИЕ
источник
Именно то, что я искал. Спасибо!
Чад Льюис
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];

}
MaxEcho
источник
Отлично. Это помогло мне. Спасибо
Йогеш Лолусаре
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"]];
orkenstein
источник
Есть шанс, что вас откажут от магазина приложений
Лука,
@ Люк, я успешно использовал его несколько раз. Нет отклонений. Но да, шанс все еще существует.
Оркенштейн
Это все еще вероятно, что это сломается в будущей версии iOS
Lope
1
@ Надеюсь, да, почему бы и нет. Я не ищу серебряную пулю.
Оркенштейн
Перебор подпредставлений на iOS 10.1 показывает, что это все еще имя класса, но настройка его внешнего вида, как показано здесь, для меня не имеет никакого эффекта.
arlomedia
2

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

[[UINavigationBar appearance] setTintColor:myColor];

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

Geo1088
источник
0

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

navigationController?.navigationBar.barTintColor = UIColor.blueColor()
navigationController?.navigationBar.tintColor = UIColor.whiteColor()
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
AbhinayMe
источник
0

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

self.navigationController?.navigationBar.tintColor = UIColor.black
Дилип Джангид
источник