2010-03-26 21 views
3

J'ai essayé de le faire:Puis-je appliquer une texture à UIToolbar?

[toolbar setTint:[UIColor colorWithPatternImage:[UIImage imageNamed:@"thingFromMyBundle.png"]]]; 

mais il vient de se terminer en noir. Au début, j'ai supposé que vous n'étiez pas autorisé à "teinter" avec une texture, mais j'ai vu récemment des applications qui peuvent le faire. Est-ce que je manque quelque chose?

Merci.

Répondre

8

Ajouter 2 fichiers à votre projet, appelez UINavigationBar-CustomTexture.h et UINavigationBar-CustomTexture.m par exemple, dans les fichiers mis ceci:

.h:

#import <UIKit/UIKit.h> 
@interface UINavigationBar (CustomTexture) 
@end 

fichier .m:

#import "UINavigationBar-CustomTexture.h" 

@interface UIView (CustomTexture) 
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx; 
@end 

@implementation UINavigationBar (CustomTexture) 
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    if ([self isMemberOfClass:[UINavigationBar class]]){ 
     UIImage *image = [UIImage imageNamed:@"myImage.png"]; 
     CGContextScaleCTM(ctx, 1.0f, -1.0f); 
     CGContextDrawImage(ctx, CGRectMake(0, -image.size.height, self.frame.size.width, self.frame.size.height), image.CGImage); 
    }else{ 
     [super drawLayer:layer inContext:ctx]; 
    } 
} 
@end 

Incluez le fichier .h dans lequel vous instanciez votre contrôleur de navigation. Faites votre fichier png 320x44. En fonction de votre texture, changer la couleur de la teinte de votre barre de navigation à quelque chose comme ça (pour que les boutons de la barre de navigation regarder mieux):

[self.navigationController.navigationBar setTintColor:[UIColor colorWithHue:0 saturation:0 brightness:0.5f alpha:0.1f]]; 
+0

Cela fonctionne pour moi, mais je reçois un ": doClip: chemin vide.". Si je supprime le CGContextClip (ctx); eux l'avertissement disparaît (et tout fonctionne toujours). – morais

+2

Une catégorie n'est vraiment pas un bon moyen de gérer le dessin personnalisé en général. Vous remplacez l'implémentation standard (s'il y en a une) de UINavigationBar et n'appelez jamais cette implémentation. Le sous-classement est la bonne façon de le gérer, mais il nécessite un peu plus de travail en définissant la classe de la barre de navigation dans le fichier xib, mais il est bien plus à l'épreuve du temps. – wbyoung

2

Voici comment je suis arrivé à ce problème:

_titleToolbar= [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, kDeviceWidth, 34.0f)]; 
[_titleToolbar setTranslucent:YES]; 
[_titleToolbar setBackgroundColor:[UIColor clearColor]]; 

CALayer* backgroundLayer = [CALayer layer]; 
[backgroundLayer setFrame:CGRectMake(0, 0, kDeviceWidth, _titleToolbar.frame.size.height)]; 

UIImage* patternImage = [UIImage deviceImageNamed:@"topToolbarBackground"]; 
[backgroundLayer setBackgroundColor:[UIColor colorWithPatternImage:patternImage].CGColor]; 
[[_titleToolbar layer] insertSublayer:backgroundLayer atIndex:0];