Cocoa touch 不能';工具条是透明的吗?

Cocoa touch 不能';工具条是透明的吗?,cocoa-touch,Cocoa Touch,我尝试了下面的代码,但不起作用 [helloToolbar setBackgroundColor:[UIColor clearColor]]; 你能做的最好的事情就是使用 [helloToolbar setBarStyle:UIBarStyleBlack]; [helloToolbar setTranslucent:YES]; 这将为您提供一个黑色但半透明的工具栏。要制作一个完全透明的工具栏,请使用以下方法。简而言之,创建一个新的TransparentToolbar类,该类继承自UITool

我尝试了下面的代码,但不起作用

[helloToolbar setBackgroundColor:[UIColor clearColor]];

你能做的最好的事情就是使用

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

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

要制作一个完全透明的工具栏,请使用以下方法。简而言之,创建一个新的
TransparentToolbar
类,该类继承自UIToolbar,并使用它代替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

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

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

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

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

我们刚刚注意到,覆盖drawRect在iOS 4.3中不再起作用。不再调用它(编辑:似乎只在模拟器中)。而是调用drawLayer:inContext:

发布了一个很好的解决方案


现在,您可以通过将每个UIToolbar对象的tintColor设置为[UIColor clearColor]:)将其设置为透明。

我刚刚在模拟器和手机上用iOS 4.3测试了以下内容,看起来效果不错。子类UIToolbar,提供一种方法:

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

感谢@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)
    {
    }
  }

在iOS 5中,以下工作:

UIToolbar *bar = [[UIToolbar alloc] initWithFrame:CGRectZero];
if (bar.subviews.count > 0)
     [[[bar subviews] objectAtIndex:0] removeFromSuperview];
这是因为背景现在是一个子视图。这段代码即使在新的iOS迭代中也是安全的,但它可能会停止工作。这不是私人API使用,您的应用可以安全地提交到应用商店


在将任何
UIBarButtonItem
s添加到工具栏之前,请确保删除背景视图。或者我的代码将无法工作。

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

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


这在iOS5.1中非常容易实现。我正在匹配大小,因为只有背景与工具栏本身具有相同的帧大小。当然,您可以使用其他标准

享受

创建UIToolbar的子类,如下所示:

.h:

#导入
@界面UIClearToolbar:UIToolbar
@结束
.m:

#导入“UIClearToolbar.h”
@实现UIClearToolbar
-(无效)布局子视图{
//在进行此调用之前,super已经布置好了子视图。
[self.subviews enumerateObjectsUsingBlock:^(UIView*obj,NSUInteger idx,BOOL*stop){
if(CGSizeEqualToSize(self.frame.size,obj.frame.size)||
self.frame.size.width透明(iOS 5.0):

[toolbar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
[toolbar setBarStyle:UIBarStyleBlack];
[toolbar setTranslucent:YES];
半透明:

[toolbar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
[toolbar setBarStyle:UIBarStyleBlack];
[toolbar setTranslucent:YES];

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

如果需要透明工具栏,请在其上调用
setTransparent

如果需要不透明工具栏,请自行设置背景色或添加imageView。

查看下面的解决方案,以获得完全透明(非半透明)的工具栏工具栏。我添加了一个在iOS 5.1上运行的答案-你可以在布局子视图期间对UIToolbar进行子类化并查询子视图。请注意,这将使应用程序中的所有工具栏都透明。谢谢!我这样做了,但现在由于某些原因,工具栏是黑色的,不透明…这很好用,我使用它作为一种“简单”的方式,在t中放置多个按钮导航栏的左侧和/或右侧(另一个按钮具有工具栏作为自定义视图)。但是,在这种情况下,还需要在applyTranslucentBackground方法中将tintColor设置为clearColor。我认为它在iOS 5上停止工作。但在iOS 5上,您有“正确的”使其透明的方法。iOS5.1正确的方法对我不起作用,所以我按原样实现了它,它起到了一种魅力。也许等我有时间的时候,我会看到哪里出了问题,然后用新的iOS5方法来完成。我的UIBarButton项目应该是白色的,但这个工具栏代码非常模糊。有没有其他方法可以提供我想要的东西iOS 4?iOS>5.0的不错的解决方案。谢谢你可以给它一个新分配的UIImage:
[工具栏setBackgroundImage:[UIImage alloc]forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
可能的副本对我有用。Swift:self.setBackgroundImage(UIImage()),forToolbarPosition:。任意,barMetrics:。默认值)
[toolbar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
[toolbar setBarStyle:UIBarStyleBlack];
[toolbar setTranslucent:YES];
@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