Question

J'ajoute une image d'arrière-plan personnalisée à ma barre UINavigationBar en remplaçant le paramètre drawRect via une catégorie.

- ( 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 correctement jusqu'à ce que vous essayiez d'utiliser la propriété navigationitem.prompt. Au lieu de faire une animation fluide de la présentation de l’invite, elle le fait brusquement.

Y a-t-il des suggestions sur la façon de remédier à cela? Ou une autre façon de définir une image d'arrière-plan.

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

TIA!

EDIT: J'ai aussi essayé la méthode swizzling, qui fonctionnerait bien si je pouvais laisser mon image s'étirer, mais comme l'image n'est pas extensible, je dois trouver comment exploiter l'animation qui se produit pour effectuer un décalage. au lieu d'un étirement.

EDIT: voir ma réponse hacky ci-dessous

Était-ce utile?

La solution

Donc, très "hacky", mais c’est ce qui se fait de mieux que je puisse le faire faire ce que je veux ...

En gros, lorsque la méthode est en train de grésiller, laisser l’étirement de l’image ne me convenait pas, car j’avais aussi des angles arrondis. Alors, au lieu de cela, j’ai créé une image transparente séparée des coins et l’ajoutée en tant que sous-vue afin qu’ils ne soient pas affectés par l’animation par étirement.

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 en savoir plus sur la méthode swizzling ... http://www.cocoadev.com/index .pl? MethodSwizzling et Méthode Swizzle sur un appareil iPhone

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top