难道UIToolBar不透明吗?

时间:2010-03-18 09:58:11

标签: cocoa-touch

我尝试以下代码,但它不起作用。

[helloToolbar setBackgroundColor:[UIColor clearColor]];

12 个答案:

答案 0 :(得分:57)

要制作完全透明的工具栏,请使用方法described here。简而言之,创建一个继承自UIToolbar的新TransparentToolbar类,并使用它来代替UIToolbar。

<强> TransarentToolbar.h

@interface TransparentToolbar : UIToolbar
@end

<强> TransarentToolbar.m

@implementation TransparentToolbar

// Override draw rect to avoid
// background coloring
- (void)drawRect:(CGRect)rect {
    // do nothing in here
}

// Set properties to make background
// translucent.
- (void) applyTranslucentBackground
{
    self.backgroundColor = [UIColor clearColor];
    self.opaque = NO;
    self.translucent = YES;
}

// Override init.
- (id) init
{
    self = [super init];
    [self applyTranslucentBackground];
    return self;
}

// Override initWithFrame.
- (id) initWithFrame:(CGRect) frame
{
    self = [super initWithFrame:frame];
    [self applyTranslucentBackground];
    return self;
}

@end

(上面链接的博文中的代码)

答案 1 :(得分:25)

在iOS 5中,只需调用setBackgroundImage并传递透明图像。

我是这样做的(我动态生成透明图像):

CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[toolbar setBackgroundImage:transparentImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

答案 2 :(得分:16)

您可以做的最好的事情是使用

[helloToolbar setBarStyle:UIBarStyleBlack];
[helloToolbar setTranslucent:YES];

这将为您提供一个黑色但半透明的工具栏。

答案 3 :(得分:14)

透明(iOS 5.0):

[toolbar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

<强>透光性:

[toolbar setBarStyle:UIBarStyleBlack];
[toolbar setTranslucent:YES];

答案 4 :(得分:7)

所有设备的累积解决方案,从最古老的iOS 3.0(iPhone 1)到最新的iOS 6.1(iPad mini)。

@implementation UIToolbar (Extension)

- (void)drawRect:(CGRect)rect
{
    if (CGColorGetAlpha(self.backgroundColor.CGColor) > 0.f)
    {
        [super drawRect:rect];
    }
}

- (void)setTransparent
{
    //iOS3+
    self.backgroundColor = [UIColor clearColor];

    //iOS5+
    if ([self respondsToSelector:@selector(setBackgroundImage:forToolbarPosition:barMetrics:)])
    {
        [self setBackgroundImage:[[UIImage new] autorelease] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
    }
    //iOS6+
    if ([self respondsToSelector:@selector(setShadowImage:forToolbarPosition:)])
    {
        [self setShadowImage:[[UIImage new] autorelease] forToolbarPosition:UIToolbarPositionAny];
    }
}

@end

如果需要透明工具栏,请在其上调用setTransparent。 如果需要非透明工具栏,请设置您选择的backgroundColor或自行添加imageView。

答案 5 :(得分:6)

另一种解决方案是为UIToolbar定义一个类别:

@implementation UIToolbar(Transparent) 
-(void)drawRect:(CGRect)rect {
    // do nothing in here
}
@end

在IB中,将工具栏设置为黑色半透明且不透明。

答案 6 :(得分:2)

我们刚刚注意到,重写drawRect不再适用于iOS 4.3。它不再被调用(编辑:似乎只在模拟器中)。相反,drawLayer:inContext:被调用。

发布了一个很棒的解决方案here

现在您可以将每个UIToolbar对象设置为透明,方法是将其tintColor设置为[UIColor clearColor]:)

答案 7 :(得分:2)

使用iOS 5可以实现以下功能:

UIToolbar *bar = [[UIToolbar alloc] initWithFrame:CGRectZero];
if (bar.subviews.count > 0)
     [[[bar subviews] objectAtIndex:0] removeFromSuperview];

这是因为背景现在是一个子视图。即使使用iOS的新迭代,此代码也是安全的,它可能会停止工作。这不是私有API使用,您的应用可以安全地提交到商店。

确保在向栏添加任何UIBarButtonItem之前删除backgroundView。或者我的代码不起作用。

答案 8 :(得分:1)

我刚刚在模拟器和手机上测试了以下iOS 4.3,似乎工作正常。子类UIToolbar,提供一种方法:

- (void)drawRect:(CGRect)rect 
{
[[UIColor colorWithWhite:0 alpha:0.6f] set]; // or clearColor etc
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
}

答案 9 :(得分:1)

toolbar.barStyle = UIBarStyleBlackTranslucent;

答案 10 :(得分:1)

这适用于iOS5.1,只需极少的工作量。我匹配大小,因为只有背景将具有与工具栏本身相同的帧大小。当然,你可以使用其他标准。

享受。

按如下方式创建UIToolbar的子类:

·H:

#import <UIKit/UIKit.h>

@interface UIClearToolbar : UIToolbar

@end

的.m:

#import "UIClearToolbar.h"

@implementation UIClearToolbar

- (void)layoutSubviews {
    // super has already laid out the subviews before this call is made.
    [self.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
        if (CGSizeEqualToSize(self.frame.size, obj.frame.size) ||
        self.frame.size.width <= obj.frame.size.width) {  // on device, the background is BIGGER than the toolbar.) {
            [obj removeFromSuperview];
            *stop = YES;
        }
    }];
}

@end

答案 11 :(得分:0)

感谢@morais提供的解决方案 - 这里的代码转换为MonoTouch:

  public class TransparentToolbar : UIToolbar
  {
    public TransparentToolbar()
    {
      init();
    }

    public TransparentToolbar(RectangleF frame) : base(frame)
    {
      init();
    }

    void init()
    {
      BackgroundColor=UIColor.Clear;
      Opaque=false;
      Translucent=true;
    }

    public override void Draw(RectangleF rect)
    {
    }
  }