2010-05-20 10 views
3

J'ai besoin de dessiner une image de fond ou de définir une couleur de teinte sur une barre de navigation, mais j'ai également besoin de l'option pour que la barre de navigation apparaisse normalement. J'utilise actuellement une catégorie pour prendre en charge Si mon application ne spécifie pas d'image d'arrière-plan, que puis-je faire pour que la méthode drawRect fonctionne normalement?Image de fond de la barre de navigation en option

C.-À -

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)drawRect:(CGRect)rect { 
    if(hasImage){ 
     UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://myimageurl.com/img.jpg"]]]; 
     [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    }else{ 
     ?????? 
    } 
} 
@end 

Répondre

0

Théoriquement, vous pouvez le faire en sous-classement UINavigationBar remplaçant uniquement la méthode drawRect:, puis appeler [super drawRect:rect] lorsque vous voulez utiliser le comportement par défaut.

Mais je ne crois pas que vous puissiez en pratique parce que vous n'instanciez pas le UINavigationBar directement.

La résolution de ce problème est possible mais non triviale, car la méthode de catégorie «remplace» la méthode d'origine plutôt que de la sous-classer du point de vue de l'exécution. C'est pourquoi l'utilisation, disons, de super ne fonctionnera pas.

Vous devriez vérifier ce post sur « supersequent » la mise en œuvre: http://cocoawithlove.com/2008/03/supersequent-implementation.html

(Ce lien et d'autres idées connexes sont la réponse à cette question: Using Super in an Objective C Category?)

+0

Excellente info. Je vous remercie. –

1

En fait, je fini par faire tout à fait quelque chose différent et je me demande pourquoi personne n'a découvert cela auparavant. L'une des approches que j'ai vues au cours de mon Google sur le sujet consistait simplement à ajouter une image sous forme de sous-vue à UINavigationBar. Le seul problème était que les boutons de la barre n'étaient pas cliquables. La solution consistait à désactiver l'interaction de l'utilisateur sur l'image.

myUIImageView.userInteractionEnabled = NON; [myNavController.navigationBar addSubview: myUIImageView]; [myNavController.navigationBar sendSubviewToBack: myUIImageView];

Avec cela, tout semble/fonctionne bien et je n'ai pas besoin de surcharger la méthode drawRect avec une catégorie, des méthodes de swizzle ou n'importe quel truc funky. Simple et propre.

Questions connexes