1

我一直拥有这段代码,它曾经可以工作,但我认为它在 iOS 6 中开始表现出令人讨厌的行为。SO 上有几个类似的线程,但我还没有找到我满意的解决方案到目前为止。我找到了一种解决方法(见下文),但这似乎不是“正确”的方法。

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

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

图表 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 的建议,我之前已经添加了这个,[toolBarButtons setItems...]但它没有任何影响:

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

我找到了这个线程,jd的答案提供了一个解决方法(编辑以匹配我的变量):

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];

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

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

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

4

1 回答 1

3

我在我的应用程序中做同样的事情。(这让我发疯了,我们必须UIToolbar在 a 中托管 aUINavigationBar只是因为UINavigationBar它的渲染UIBarButtonItem's方式不同UIToolbar。)

这是我为避免您遇到的问题而采取的措施:

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

上次我检查时,navigationBar.barStyle 是一个未在 UIBarStyle 枚举中以其他方式记录的值......我认为它是“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 手机模拟器中测试。

- (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;
}
于 2013-05-17T22:00:40.333 回答