UIImage UIToolbarbutton不完全透明

我已经有了这个代码永远,它曾经工作,但它开始展示一个恼人的行为,我认为,iOS 6。有几个类似的线程上,所以我还没有find一个解决scheme,我很舒服到目前为止。 我find了一个解决方法(见下面),但它似乎不是“正确”的方式来做到这一点。

这是一个问题相同的线程,但没有答案。

当我使用图像作为UIBarButtonItem并将其放入UIToolbarUIToolbar的包含矩形不完全透明。 我用于UIBarButtonItem的PNG图像是透明的,所以这不是问题。 这里是一个例子:

图表1

当我使用文本而不是图像作为UIBarButtonItem ,透明度按预期工作。 如此:

图表2

这是自永远起作用的代码:

 NSMutableArray *buttonItems = [[[NSMutableArray alloc] initWithCapacity: 1] autorelease]; UIImage *printButtonImage = [UIImage imageNamed:@"buttonPrint.png"]; UIToolbar *toolBarButtons = [[[UIToolbar alloc] initWithFrame:CGRectMake( 0, 0, 52.0, 44.01 )] autorelease]; UIBarButtonItem *printButton = [[[UIBarButtonItem alloc] initWithImage:printButtonImage style:UIBarButtonItemStyleBordered target:self action:@selector(printDocument:)] autorelease]; [buttonItems addObject:printButton]; [toolBarButtons setItems:buttonItems animated:YES]; self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:toolBarButtons] autorelease]; 

根据SO的build议,我在[toolBarButtons setItems...]之前添加了这个,但是它没有影响:

 toolBarButtons.backgroundColor = [UIColor clearColor]; [toolBarButtons setTranslucent:YES]; [toolBarButtons setOpaque:NO]; 

我发现这个线程 ,jd的答案提供了一个解决方法(编辑匹配我的variables):

 const float colorMask[6] = {222, 255, 222, 255, 222, 255}; UIImage *img = [[UIImage alloc] init]; UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)]; [toolBarButtons setBackgroundImage:maskedImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault]; 

我也看到了这个问题的几个解决scheme,需要获取navigationController控制器的顶部或底部的颜色和应用渐变,但我拒绝相信,没有办法使UIToolbar的矩形完全透明,这应该允许navigationController颜色通过,渐变和所有。

是否应用蒙版图像真的是模拟正确UI体验的唯一方法? 苹果真的没有提供一种方法来简单地使一个包含矩形的UIToolbar完全透明吗?

现在,我有正确的行为 ,但我不觉得我有正确的解决scheme 。 这感觉像一个黑客。 有没有人知道有更好的方法来完成这个?

我在我的应用程序中做同样的事情。 (这UIBarButtonItem'sUINavigationBar中托pipe一个UIToolbar ,因为UINavigationBar不像UIToolbar那样渲染UIBarButtonItem's 。)

以下是我所做的以避免您看到的问题:

 toolbar.barStyle = self.navigationController.navigationBar.barStyle; toolbar.tintColor = self.navigationController.navigationBar.tintColor; 

我最后一次检查navigationBar.barStyle是一个没有在UIBarStyle枚举中logging的值…我认为它是'3'。

编辑:恼人的是,这不适用于iPhone,因为它在iPad上工作…

这个UIToolbar子类似乎工作正常。 用它代替普通的UIToolbar:

 @interface NavToolbar : UIToolbar @end @implementation NavToolbar - (void) layoutSubviews { [super layoutSubviews]; self.backgroundColor = [UIColor clearColor]; self.opaque = NO; } - (void) drawRect:(CGRect)rect { } @end 

而且,这里是演示使用它的代码。 没有NavToolbar,我看到你提出的问题; 与NavToolbar它根据需要工作。 在iOS6手机模拟器中testing。

 - (void)viewDidLoad { [super viewDidLoad]; UIToolbar* tb = [[NavToolbar alloc] initWithFrame: CGRectMake(0, 0, 44, 44)]; UIBarButtonItem* bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target: nil action: nil]; tb.items = @[bbi]; tb.barStyle = self.navigationController.navigationBar.barStyle; UIBarButtonItem* tbbbi = [[UIBarButtonItem alloc] initWithCustomView: tb]; tbbbi.width = 44; self.navigationItem.rightBarButtonItem = tbbbi; }