UIBarButtonItem色调在iOS7设备上的6.1应用程序中无效

时间:2013-09-24 16:11:41

标签: ios ios7 xcode5

我有一个视图控制器,它在导航栏上添加一个橙色色调的按钮。

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中的错误还是我做错了。

3 个答案:

答案 0 :(得分:1)

这似乎是iOS 7处理iOS 6.1 UI元素的一个错误。我尝试了很多方法,无法可靠地设置UIBarButtonItem色调。将颜色添加到viewDidLoad中的导航项后设置颜色适用于第一个屏幕,但不适用于以后的屏幕。您可以在viewDidAppear:中执行此操作,但在动画期间最终会显示蓝色。

您最好的选择是在导航栏上设置色调颜色,然后如果您需要该栏看起来不同,请设置其背景图像。

答案 1 :(得分:0)

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

将此添加到您的代码中。

答案 2 :(得分:0)

经过几个小时,我想我已经找到了解决方法。我发现了这个解决方案,因为我有一些有趣的行为,可以切换可以工作的按钮的颜色,但直接在viewDid / Will /任何不起作用的设置按钮色调。差异似乎是必须在调用viewDidLoad之后的navigationItem上创建和设置按钮。

长话短说,重新创建按钮,设置按钮色调,并在以下UINavigationControllerDelegate方法中更新navigationItem就可以了:

- (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。我没有创建那么多UINavigationControllers所以我可以忍受泄漏,但是如果有人能提出一种方法来保持委托只有UINavigationController,我有兴趣知道吗?