2009-10-25 8 views
3

J'ajoute une image d'arrière-plan personnalisée à mon UINavigationBar en remplaçant le drawRect via une catégorie.UINavigationBar image d'arrière-plan via drawRect - problème avec l'animation rapide

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

Cette solution semble fonctionner très bien, jusqu'à ce que vous essayez d'utiliser la propriété navigationitem.prompt. Au lieu de faire une animation fluide de présentation de l'invite, il le fait brusquement.

Y a-t-il des suggestions pour y remédier? Ou une autre façon de définir une image de fond.

PS. J'essaie d'éviter d'ajouter une image d'arrière-plan en tant que sous-vue à cause de la façon dont les choses se réorganisent lorsque les vues sont en mode push/pop. Et je détesterais envoyer SendviewToBack dans viewDidAppear de chaque vue.

TIA! EDIT: J'ai également essayé la méthode swizzling, qui fonctionnerait bien si je pouvais juste laisser mon image s'étirer, mais comme l'image n'est pas extensible, je dois trouver comment exploiter l'animation qui arrive à faire un décaler au lieu d'un étirement.

EDIT: voir ma réponse ci-dessous hacky

+0

En ce qui concerne la façon dont vous implémentez drawRect :, vous pouvez jetez un coup d'oeil à http://stackoverflow.com/questions/1085479/override-a-method-via-objc-category-and-call-the-default-implementation –

+0

En fait, j'ai aussi essayé la méthode swizzling ce drawRect particulier, mais les résultats ne sont pas très agréables. Il reprend l'animation d'origine, mais l'image personnalisée ne fait que "apparaître". – dizy

+0

En fait, je viens de réaliser que ma méthode swizzling ne compile pas sur l'appareil. Est-il possible de basculer sur l'appareil iPhone? – dizy

Répondre

0

donc très « aki », mais est le plus proche, je peux l'obtenir pour faire ce que je veux ...

Fondamentalement, lorsque la méthode swizzling, en laissant simplement la L'étirement de l'image ne fonctionnait pas bien pour moi parce que j'avais aussi des coins arrondis. Donc, à la place, j'ai fait les coins d'un img transparent distinct et l'ajouter comme sous-vue afin qu'ils ne soient pas affectés par l'animation stretch.

Donc ma catégorie ressemble maintenant à ceci ..

 
#import "UINavigationBar+custom.h" 

#define cornersTag 1 

@implementation UINavigationBar (UINavigationBarCategory) 

-(void)setCornersIfNeeded{ 
UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag]; 
if(!corners){ 
    UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0]; 
    corners = [[[UIImageView alloc] initWithImage:img] autorelease]; 
    corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height); 
    corners.tag = cornersTag; 
    [self addSubview:corners]; 
} 
} 

- (void)customDrawRect:(CGRect)rect{ 
[self customDrawRect:rect]; 
[[UIImage imageNamed:@"navbar.png"] drawInRect:rect]; 
[self setCornersIfNeeded]; 
} 

@end 

pour plus sur la méthode swizzling ... http://www.cocoadev.com/index.pl?MethodSwizzling et Method Swizzle on iPhone device

+0

Je ne suis pas sûr de comprendre pourquoi vous avez besoin d'un deuxième image et tout pour éviter que l'image ne soit étirée ... vous faites tout le dessin, ne contrôlez-vous pas le rapport d'aspect auquel elle est dessinée? Ou est le problème que l'image a toujours besoin de remplir la vue, mais la vue peut exister sous différentes formes? (De plus, soyez prudent, car le rect passé à drawRect peut ne pas * être l'image complète de la vue.) –

+0

Si j'ai une image avec des coins arrondis et que je la laisse s'étirer, les coins seront déformés. Si je ne le laisse pas s'étirer et que je voudrais simplement le faire glisser, c'est quelque chose que je n'arrive pas à faire. Il semble qu'il dessine le cadre d'état étendu une fois, mais l'étend jusqu'à l'état réduit, puis anime l'extension en l'étirant au dessin étendu original. Dans quelle situation le rect ne peut-il pas être plein cadre/limites? Si cela fonctionne correctement pour moi, devrais-je encore être inquiet? – dizy