Колір стрілки кнопки "назад" iOS 7


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 Я змінив свою власну інфляційну власність NavBarColor, щоб змусити її працювати, а потім встановив фактичну кольоровість navbarcolor на інший колір. Я не впевнений, що відбувається, але це рішення спрацювало на мене
kevinl

1
Поведінка деяких властивостей UINavigationBarзмінено з iOS 7. Подивіться на відповідь, щоб побачити також вплив деяких інших властивостей .
Бхавін

будь ласка , допоможіть з цією проблемою: stackoverflow.com/questions/29923813 / ...
Мілош Kresović

Відповіді:


438

Щоб змінити колір шеврону кнопки "назад" для конкретного навігаційного контролера *:

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

* Якщо ви використовуєте додаток з більш ніж 1 навігаційним контролером, і ви хочете, щоб цей колір шеврона застосовувався до кожного, ви можете скористатися проксі-сервером зовнішнього вигляду, щоб встановити кнопку назад назад для кожного навігаційного контролера:

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

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

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

3
Це застосовуватиметься лише до всього додатка, якщо ви використовуєте один і той же контролер навігації для всього додатка. Я фактично рекомендую пропозицію Барта.
Кайл Клегг

1
Я оновив свою відповідь приміткою про декілька навігаційних контролерів. Я все ще не погоджуюся, що пропозиція Барта - це "правильна" відповідь, оскільки існує багато інших побічних ефектів, коли ви встановлюєте колір відтінку всього додатка. Крім того, в оригінальному запитанні не було питання про тематизацію всього додатка, а лише про те, як тематизувати кнопку "назад".
DiscDev

1
Схоже, це не визначає колір заднього шеврону.
jcampbell1

2
@ jcampbell1 - Я використовую це в кількох своїх програмах успішно ... можливо, ви не читали застереження про декілька UINavigationControllers.
DiscDev

7
for swiftUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu

57

Ви повинні встановити tintColor для всього додатка.

self.window.tintColor = [UIColor redColor];

Або у Swift 3:

self.window?.tintColor = UIColor.blue

Джерело: Посібник з переходу користувальницького інтерфейсу iOS 7


4
Якщо ви хочете встановити лише колір задньої кнопки шеврон (а не весь додаток), як зазначено в оригінальному питанні, це неправильна відповідь. Дивіться моя відповідь тут для правильної відповіді: stackoverflow.com/a/18809412/1103584
DiscDev

Я використовував це в своєму делеґаті програми, щоб змінити кнопочки спини на чорні. Розмістіть у програмі методDidFinishLaunchingWithOptions ... 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 не працювала.
Річ Фокс

@GlennMaynard Ти маєш рацію - найкращим способом реалізувати це було б перегляд масиву підвидів перегляду, повернутих до self.navigationController.navigationBar.subviewsтих пір, поки не знайдеться кнопка "назад".
Еван Р

@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
америка

7

В iOS 6 tintColor підфарбовував фон панелей навігації, панелей вкладок, панелей інструментів, панелей пошуку та діапазонів. Щоб підфарбувати фон бар у iOS 7, скористайтеся властивістю barTintColor.

Ресурси проектування iOS 7 Посібник з переходу на 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." посилання
бачонк

3

У випадку, якщо ви створюєте власну кнопку назад на основі UIButton із зображенням стрілки, ось фрагмент підкласу. Використовуючи його, ви можете або створити кнопку в коді, або просто призначити клас в Interface Builder будь-якому 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

Якщо ви хочете змінити лише стрілку задньої панелі АЛЕ у всьому додатку, зробіть це:

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

Є ймовірність цього відхилити вас у магазині додатків
Лук

@Luke, я успішно використовував його кілька разів. Відхилень немає. Але, так, шанс все ж є.
orkenstein

Цілком імовірно, що вона буде зламана у майбутній версії iOS
Lope

1
@Lope, так, чому б ні. Я не шукаю срібної кулі.
orkenstein

Ітерація через підпогляди на 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

Швидко натисніть кнопку 3, щоб змінити колір стрілки кнопки повернення UIBarButton

self.navigationController?.navigationBar.tintColor = UIColor.black
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.