iOS 7 popover包含progressbar和barbuttonItem色彩

时间:2014-01-22 10:42:41

标签: ios objective-c uibarbuttonitem

我的导航栏上有问题。 UIBarButtonItem tintColor为橙色,但当我出现popover时,barButtonItem tintColor会更改为lightGray。导航栏色调颜色为whiteColor。在弹出提示后我需要留下橙色。 有人能帮我吗?谢谢!

编辑1

我做了可选择的barButtonItem,我有UIBarButtonItem的子类:

-(void)setSelected:(BOOL)selected {
    _selected = selected;
    if (selected) {
        self.tintColor = self.selectedColor;
    } else {
        self.tintColor = self.defaultColor;
    }
}

-(id)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action defaultColor:(UIColor *)defaultColor {
    self = [super initWithImage:image style:style target:target action:action];
    if (self) {
        self.tintColor = defaultColor;
    }
    return self;
}

-(id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action defaultColor:(UIColor *)defaultColor {
    self = [super initWithTitle:title style:style target:target action:action];
    if (self) {
        self.tintColor = defaultColor;
    }
    return self;
}

编辑2

Thanx Warren Burton的回答,解决方案是:

self.navigationController.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;

3 个答案:

答案 0 :(得分:4)

此行为是iOS 7“正常”。它告诉您的用户该按钮当前不是您的活动UI的一部分。

如果您希望绕过此常规约定,可以继承UIBarButtonItem并覆盖

- (void)tintColorDidChange

只留下一个空实现。

- (void)tintColorDidChange {
   //nothing to see here, move along
}

当弹出窗口呈现时,呈现视图会转到tintMode UIViewTintAdjustmentModeDimmed,因此即使您提供另一种颜色,系统也会使该颜色变为灰色(去饱和?)。

这就是为什么你需要覆盖tintColorDidChange以阻止发生这种情况。

来自文档...

  

当此属性的值为UIViewTintAdjustmentModeDimmed时,   修改tintColor属性的值以提供灰色   外观

答案 1 :(得分:0)

我通过在外部编辑器中更改条形按钮系统项目png文件的颜色来解决我的问题,包括该图像到项目并通过

加载它
[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"UIButtonBarTrashBlack"] style:UIBarButtonItemStyleBordered target:self action:@selector(myAction)];

我使用有用的UIKit-Artwork-Extractor找到了内部系统图片。

我使用免费软件GIMP编辑了艺术作品的颜色。

答案 2 :(得分:0)

它确实看起来像一个Apple bug,你应该用bug报告器输入一个bug。也就是说,我可以给你一个相对无痛的解决方法:将此代码添加到RecipetTableViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.title = @"Recipe Book";

    UIBarButtonItem *it = [[UIBarButtonItem alloc] initWithTitle:self.title style:UIBarButtonItemStylePlain target:nil action:NULL];
    UIImage * btBack_30 = [[UIImage imageNamed:@"btBack_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 5)];
    [it setBackButtonBackgroundImage:btBack_30 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    self.navigationItem.backBarButtonItem = it;
}
编辑:如果感兴趣,可以复制此错误,引用它的bug越多,苹果就越有可能修复它:

摘要:在第二次出现按钮之前,为后栏按钮项设置UIBarButtonItem外观代理没有任何影响。

重现步骤:在appDelegate中,在出现任何内容之前,添加以下语句:

UIImage * gradientImage44 = [[UIImage imageNamed:@"navBar_44"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
 UIImage * gradientImage32 = [[UIImage imageNamed:@"navBar_32"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
 // Set the background image for all UINavigationBars [[UINavigationBar appearance] setBackgroundImage:gradientImage44 forBarMetrics:UIBarMetricsDefault];
 [[UINavigationBar appearance] setBackgroundImage:gradientImage32 forBarMetrics:UIBarMetricsLandscapePhone];

预期结果:首次按下viewController时,其后退按钮中包含图像。

实际结果:第一次出现时,没有图像。再次按下视图。实际上,当你第一次点击按钮时它会出现,但是当按钮第一次出现时却不会出现。

版本:Xcode 5.0.1,iOS 7.0.3

注意:在导航控制器的根视图控制器中添加它可以使其工作:

-(void)viewDidLoad 
{ 
[super viewDidLoad];

self.title = @"Recipe Book";
 UIBarButtonItem *it = [[UIBarButtonItem alloc] initWithTitle:self.title style:UIBarButtonItemStylePlain target:nil action:NULL]; 
UIImage * btBack_30 = [[UIImage imageNamed:@"btBack_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 5)];
 [it setBackButtonBackgroundImage:btBack_30 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; self.navigationItem.backBarButtonItem = it;  
}

快乐编码!!!