3

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

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 设备中运行良好。也就是说,按钮显示为橙色。

在此处输入图像描述

在 iOS7 设备中,按钮首先显示为蓝色。

在此处输入图像描述

当我点击它时,按钮变为橙色。

在此处输入图像描述

该应用程序是针对 iOS 6.1 SDK 编译的。这是iOS7中的错误还是我做错了什么。

4

3 回答 3

1

这似乎是 iOS 7 处理 iOS 6.1 UI 元素的一个错误。我尝试了多种方法,但无法可靠地设置UIBarButtonItem色调。在将颜色添加到导航项后设置颜色viewDidLoad适用于第一个屏幕,但不适用于后面的屏幕。你可以这样做,viewDidAppear:但在动画过程中你最终会变成蓝色。

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

于 2013-09-24T17:35:29.960 回答
0
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:(247/255.0) green:(151/255.0) blue:(48/255.0) alpha:1.0];

将此添加到您的代码中。

于 2013-09-30T10:13:11.093 回答
0

几个小时后,我想我已经找到了一个解决方法。我发现了这个解决方案,因为我有一些有趣的行为可以切换可以工作的按钮颜色,但是直接在 viewDid/Will/whatever 中设置按钮颜色是行不通的。不同之处似乎是必须在调用 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'd。我没有创建那么多 UINavigationController,所以我可以忍受泄漏,但是如果有人可以建议一种方法来让委托保持活动,只要它的 UINavigationController,我有兴趣知道吗?

于 2013-10-17T21:01:31.583 回答