2013-09-24 4 views
3

У меня есть контроллер просмотра, который добавляет кнопку на панель навигации с оранжевым цветом оттенка.UIBarButtonItem оттенок не работает в приложении 6.1 на устройстве iOS7

UIBarButtonItem *bt = [[UIBarButtonItem alloc] 
         initWithTitle:@"Call Us" style:UIBarButtonItemStylePlain target:self action:@selector(callUsPressed:)]; 

bt.tintColor = [UIColor colorWithRed:(247/255.0) green:(151/255.0) blue:(48/255.0) alpha:1.0]; 

self.navigationItem.rightBarButtonItem = bt; 

Это нормально работает в устройстве iOS6.1. То есть, кнопка отображается оранжевым цветом.

enter image description here

В устройстве iOS7, кнопка первой отображается как синий цвет.

enter image description here

Когда я нажимаю на него, кнопка становится оранжевым.

enter image description here

приложение компилируется против IOS 6.1 SDK. Это ошибка в iOS7, или я делаю что-то неправильно.

+0

Можете ли вы включить картинку о том, как она выглядит на ios 7? –

+0

Можете попробовать изменить оформление заказа? Сначала добавьте кнопку, затем установите цвет оттенка?Возможно, попробуйте установить tintColor в 'viewDidLoad', если вы этого не сделаете. 6.1 Поддержка SDK в iOS 7 далека от совершенства, поэтому настройка может помочь. –

ответ

1

Это, кажется, ошибка в обработке iOS 7 элементов iOS 6.1 UI. Я пробовал несколько способов и не могу надежно установить цвет оттенков UIBarButtonItem. Установка цвета после его добавления в элемент навигации в viewDidLoad работает для первого экрана, но не для последующих экранов. Вы можете сделать это в viewDidAppear:, но в итоге вы получите синий цвет во время анимации.

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

+0

Скажите, пожалуйста, Apple. –

+0

У меня проблема с iOS7, не помещающим фоновое изображение на UIBarButtonItem, только на iPad, я не могу сказать, что я делаю что-то неправильно или если это может быть ошибка, см .: [UIBarButtonItem setBackgroundImage больше не работает в iOS7 iPad] (http: //stackoverflow.com/questions/19235804/uibarbuttonitem-setbackgroundimage-not-working-anymore-in-ios7-ipad) – Leonardo

0
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:(247/255.0) green:(151/255.0) blue:(48/255.0) alpha:1.0]; 

Добавьте это в свой код.

+0

Это изменит олово всей навигационной панели. Я хочу изменить оттенок кнопки. – RajV

0

После многих часов, я думаю, что я пришел к обходному пути. Я обнаружил это решение, потому что у меня было какое-то интересное поведение, которое бы переключило цвет кнопок, которые будут работать, но установив кнопку tint прямо в viewDid/Will/что бы не получилось. Разница заключается в том, что кнопки должны были быть созданы и установлены на navigationItem через некоторое время после вызова viewDidLoad.

Короче говоря, воссоздавая кнопку, установив кнопку оттенок, и обновление navigationItem в следующем UINavigationControllerDelegate метод сделал трюк:

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

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

iOS7ButtonTintWorkAround.h:

@interface RMSiOS7ButtonTintWorkAround : NSObject <UINavigationControllerDelegate> 
@property (nonatomic, strong) RMSiOS7ButtonTintWorkAround* preventGC; 

- (id)initWithNavigationController:(UINavigationController*)navigationController; 

@end 

iOS7ButtonTintWorkAround.m:

#import "iOS7ButtonTintWorkAround.h" 

@implementation iOS7ButtonTintWorkAround 

NSObject<UINavigationControllerDelegate>* _delegate; 


- (id)initWithNavigationController:(UINavigationController*)navigationController 
{ 
    self = [super init]; 
    if (self) { 
     _delegate = [navigationController delegate]; 
     [navigationController setDelegate:self]; 
     _preventGC = self; 
    } 
    return self; 
} 

- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if(_delegate) { 
     [_delegate navigationController:navigationController willShowViewController:viewController animated:animated]; 
    } 
} 

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if(_delegate) { 
     [_delegate navigationController:navigationController willShowViewController:viewController animated:animated]; 
    } 

    if([viewController respondsToSelector:@selector(iOS7SetBarButtonTint)]) { 
     [viewController performSelector:@selector(iOS7SetBarButtonTint)]; 
    } 
} 
@end 

Поскольку свойство делегат не сильная ссылка, нужно сделать что-то, чтобы не допустить делегата от того GC'd. Я не создаю много UINavigationControllers, чтобы я мог жить с утечкой, но если кто-нибудь может предложить способ сохранить делегата только до тех пор, пока его UINavigationController, мне было бы интересно узнать его?

Смежные вопросы