我有一个视图控制器,它在导航栏上添加一个橙色色调的按钮。
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中的错误还是我做错了。
答案 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,我有兴趣知道吗?