87 votes

Comment dessiner une barre UIToolbar ou UINavigationBar transparente dans iOS7

Je voudrais un UIToolbar et / ou UINavigationBar entièrement transparent. J'ai essayé les différentes incantations suggérées pour les versions antérieures et postérieures à iOS 5, mais aucune ne semble plus fonctionner.

Comment cela pourrait-il être accompli dans iOS 7?

301voto

Gabriele Petronella Points 32362

Swift

Transparente UIToolbar

self.toolbar.setBackgroundImage(UIImage(),
                                forToolbarPosition: UIBarPosition.Any,
                                barMetrics: UIBarMetrics.Default)
self.toolbar.setShadowImage(UIImage(),
                            forToolbarPosition: UIBarPosition.Any)

Transparente UINavigationBar

self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true

Objective-C

Transparente UIToolbar

[self.toolbar setBackgroundImage:[UIImage new]
              forToolbarPosition:UIBarPositionAny
                      barMetrics:UIBarMetricsDefault];
[self.toolbar setShadowImage:[UIImage new]
          forToolbarPosition:UIToolbarPositionAny];

Transparente UINavigationBar

[self.navigationBar setBackgroundImage:[UIImage new]
                         forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;

Discussion

Paramètre translucent de YES sur la barre de navigation fait le tour, en raison d'un comportement décrit dans l' UINavigationBar de la documentation. Je vais rapporter ici les pertinentes de fragment:

Si vous définissez cette propriété sur YES sur une barre de navigation avec un opaque image de fond personnalisée, la barre de navigation appliquer un système d'opacité de moins de 1,0 à l'image.


Résultat Final

enter image description here

7voto

Adam Waite Points 2242

Si vous voulez le faire à travers l'ensemble de l'application, vous devez utiliser le UIAppearance proxy (iOS5+):

UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; navigationBarAppearance.backgroundColor = [UIColor clearColor]; [navigationBarAppearance setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; navigationBarAppearance.shadowImage = [[UIImage alloc] init];

Docs: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAppearance_Protocol/Reference/Reference.html

Article: http://nshipster.com/uiappearance/

2voto

Leo Natan Points 25262

Essayer:

 [navBar setBackgroundImage:[UIImage alloc] forBarMetrics:UIBarMetricsDefault];
 

0voto

yelled Points 9
@implementation MyCustomNavigationBar

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)setup {
    [self setupBackground];
}

- (void)setupBackground {
    self.backgroundColor = [UIColor clearColor];
    self.tintColor = [UIColor clearColor];

    // make navigation bar overlap the content
    self.translucent = YES; 
    self.opaque = NO;

    // remove the default background image by replacing it with a clear image
    [self setBackgroundImage:[self.class maskedImage] forBarMetrics:UIBarMetricsDefault];

    // remove defualt bottom shadow
    [self setShadowImage: [UIImage new]]; 
}

+ (UIImage *)maskedImage {
    const float colorMask[6] = {222, 255, 222, 255, 222, 255};
    UIImage *img = [UIImage imageNamed:@"nav-white-pixel-bg.jpg"];
    return [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];
}

@end

0voto

jakenberg Points 1305

Je suis tombé par hasard sur le fait que si je créais une sous-classe UINavigationBar puis une méthode vide -(void)drawRect: , j'obtiendrais une barre de navigation transparente. Je n'ai testé cela qu'avec iOS 7. *, mais cela semblait fonctionner!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X