¿No podría UIToolBar ser transparente?

Intento el siguiente código, pero no funciona.

[helloToolbar setBackgroundColor:[UIColor clearColor]]; 

Lo mejor que puedes hacer es usar

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

Esto te dará una barra de herramientas negra pero translúcida.

Para hacer una barra de herramientas completamente transparente, use el método descrito aquí . En pocas palabras, crea una nueva clase TransparentToolbar que hereda de UIToolbar, y úsala en lugar de 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 

(código de la publicación del blog vinculada anteriormente)

En iOS 5, simplemente llame a setBackgroundImage y pase una imagen transparente.

Así es como lo hago (genero dinámicamente una imagen transparente):

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

Transparente (iOS 5.0):

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

Translúcido:

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

Una solución acumulativa para todos los dispositivos, desde iOS 3.0 (iPhone 1) más antiguo hasta iOS 6.1 (iPad mini) más antiguo.

 @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 

Cuando desee una barra de herramientas transparente, llame a setTransparent en ella. Cuando desee una barra de herramientas no transparente, establezca un backgroundColor de su elección o agregue una imageView por su cuenta.

Otra solución sería definir una categoría para UIToolbar:

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

En el IB, establece la barra de herramientas como Translucida negra y no opaca.

Acabamos de notar que anular drawRect ya no funciona con iOS 4.3. Ya no se llama (editar: parece ser solo en Simulator). En cambio drawLayer: inContext: se llama.

Una gran solución fue publicada aquí

Ahora puede establecer que cada objeto UIToolbar sea transparente, estableciendo su tintColor en [UIColor clearColor] 🙂

Con iOS 5, lo siguiente funciona:

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

Esto se debe a que el fondo ahora es una subvista. Este código es seguro incluso con nuevas iteraciones de iOS, pero puede dejar de funcionar. Este no es el uso privado de la API, su aplicación se puede enviar a la tienda de forma segura.

Asegúrese de quitar la vista de fondo antes de agregar cualquier UIBarButtonItem a la barra. O mi código no funcionará

Acabo de probar lo siguiente con iOS 4.3 en simulador y teléfono, parece funcionar bien. La subclase UIToolbar proporciona un método:

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

Esto funciona en iOS5.1 con un mínimo esfuerzo. Estoy haciendo coincidir el tamaño, ya que solo el fondo tendrá el mismo tamaño de fotogtwig que la barra de herramientas. Podría usar otros criterios, por supuesto.

Disfrutar.

Cree una subclase de UIToolbar de la siguiente manera:

.h:

 #import  @interface UIClearToolbar : UIToolbar @end 

.metro:

 #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 

Gracias @morais por su solución: aquí está el código traducido a 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) { } }