2010-11-02 5 views
0

J'ai essayé ce qui suit:catégories UIToolbar drawRect: ne fonctionne pas

@implementation UIToolbar (Image) 

-(void)drawRect:(CGRect)rect { 
    UIImage *img = [UIImage imageNamed: @"navigationBar.png"]; 
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 

Sans succès, mais il fonctionne parfaitement avec le même code pour UINavigationBar + Image.

La méthode drawRect n'est pas appelée pour UIToolbar, pourquoi?

+0

Je sais que l'utilisation d'une catégorie à remplacer une méthode est utilisée d'une manière extravagante dans les échantillons. Cependant, la documentation d'Apple indique clairement que vous ne devriez pas faire cela et suggère d'utiliser plutôt la sous-classe. – Phlibbo

Répondre

0

J'ai trouvé une solution

Pour UIToolbar, si vous l'utilisez dans un UINavigationController, vous aurez envie de passer outre aussi drawLayer: inContext :, comme cela semble être utilisé au lieu de drawRect: quand utilisé dans un contrôleur de navigation, pour une raison étrange.

Source: http://atastypixel.com/blog/making-uitoolbar-and-uinavigationbars-background-totally-transparent/

Je mis en œuvre à la place - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    CALayer *imgLayer = [[CALayer alloc] init]; 
    [imgLayer setContents:(id)[[UIImage imageNamed: @"toolbar.png"] CGImage]]; 
    [imgLayer setBounds:CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height)]; 
    [imgLayer setPosition:CGPointMake(self.bounds.size.width/2,self.bounds.size.height/2)]; 
    [layer insertSublayer:imgLayer atIndex:0]; 
} 
+1

Encore une fois, je tiens à souligner que, selon Apple, l'utilisation de catégories pour remplacer les méthodes est fausse. C'est peu probable, mais votre code a) pourrait planter sur de futures plateformes/avec de futurs SDK et b) pourrait théoriquement être rejeté de l'AppStore. Vous devriez lire les lignes directrices pour les catégories, il est écrit: «Bien que le langage vous permette actuellement d'utiliser une catégorie pour remplacer les méthodes héritées de la classe, ou même les méthodes déclarées dans l'interface de classe, vous êtes fortement découragé d'utiliser cette fonctionnalité. Une catégorie ne remplace pas une sous-classe. – Phlibbo

+1

En fin de compte je l'ai sous-classé à la place, parce que j'utilise 3 différents types de barres d'outils, fond d'image, fond de couleur unie et fond par défaut. mais, ma question était vraiment sur la façon d'obtenir des catégories à travailler pour la barre d'outils, pas si c'était une bonne idée de le faire ou non. – Erik