50 votes

Arrière-plan personnalisé UINavigationBar

J'ai essayé de définir un arrière-plan personnalisé pour l'ensemble de mon NavigationBar (et pas seulement de la titleView), mais ont été à la peine.

J'ai trouvé ce fil

http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

Mais je ne suis pas sûr de savoir comment mettre en œuvre l'extrait de code qui est donné. Le code est-il mis en œuvre une nouvelle classe? Aussi où puis-je démarrent des instances de la NavigationController comme j'ai une application construite avec la fenêtre des éléments de modèle de sorte qu'il n'est pas fait dans ma racine contrôleur comme pour l'exemple

44voto

EricS Points 5072

Uddhav et leflaw ont raison. Ce code fonctionne bien:

 @interface CustomNavigationBar : UINavigationBar
@end

@implementation CustomNavigationBar
-(void) drawRect:(CGRect)rect 
{
    UIImage *image = [UIImage imageNamed: @"myNavBarImage"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

// this can go anywhere
+(UINavigationController*) myCustomNavigationController
{
  MyViewController *vc = [[[MyViewController alloc] init] autorelease];
  UINavigationController *nav = [[[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:self options:nil] objectAtIndex:0];
  nav.viewControllers = [NSArray arrayWithObject:vc];
  return nav;
}
 

Vous devez créer CustomNavigationController.xib, y placer un UINavigationController et modifier la classe navigationBar en "CustomNavigationBar".

31voto

bhavinb Points 2441

Vous devez utiliser le "apparence" proxy pour changer l'arrière-plan et d'autres propriétés de style de contrôles tels que UINavigationBar, UIToolBar etc. dans iOS 5.xx. Cependant, ce ne sont pas disponible pour iOS 4.xx donc pour la compatibilité ascendante, vous avez besoin d'une solution hybride.

Si vous souhaitez soutenir à la fois l'iOS 4.xx et iOS 5.xx des périphériques (par exemple DeploymentTarget 4.xx), vous devez être prudent dans l'emballage de l'appel à l'apparition de procuration par la vérification à l'exécution si le "apparence" sélecteur est présent ou pas.

Vous pouvez le faire par:

//Customize the look of the UINavBar for iOS5 devices
if ([[UINavigationBar class]respondsToSelector:@selector(appearance)]) {
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"NavigationBar.png"] forBarMetrics:UIBarMetricsDefault];
}

Vous devez également quitter l'iOS 4.xx solution de contournement que vous avez mis en œuvre. Si vous avez implémenté l' drawRect solution de contournement pour iOS 4.xx périphériques, comme l'a dit @ludwigschubert, vous devez laisser que:

@implementation UINavigationBar (BackgroundImage)
//This overridden implementation will patch up the NavBar with a custom Image instead of the title
- (void)drawRect:(CGRect)rect {
     UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
     [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

Cette obtiendrez de l' NavBar le même aspect dans les deux iOS 4 et iOS 5 appareils.

29voto

Lithium Points 1079

Vous devez juste surcharger drawRect comme ça:

 @implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
 

26voto

Uddhav Kambli Points 391

Mise en œuvre d'une catégorie n'est pas conseillé. iOS5 peut fournir l'aide pour ce problème. Mais pour l'ancienne Api, vous pouvez vous -

  1. Sous-classe UINavigationBar - à-dire CustomNavBar et de mettre en œuvre la coutume drawRect de Lithium de la réponse.
  2. Pour tous IB basé UINavigationControllers, fournissent CustomNavBar comme classe personnalisée pour leur UINavigationBar.
  3. Pour tous les code basé UINavigationControllers. Créer un XIB avec un UINavigationController et ne l'étape deux. Ensuite fournir une méthode de fabrique dans le code de chargement de la UINavigationController de la plume et de fournir un IBOutlet.

Par exemple.

[[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:self options:nil];
UINavigationController *navController = self.customNavigationController;
navController.viewControllers = [NSArray arrayWithObject:controller]

10voto

ardalahmet Points 920

Vous pouvez aussi remplacer l' drawLayer:inContext: méthode de UINavigationBar catégorie de la classe. À l'intérieur de l' drawLayer:inContext: méthode, vous pouvez dessiner l'image d'arrière-plan que vous souhaitez utiliser.

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

Et comme une démo complète Xcode projet sur la personnalisation de l'apparence de l' UINavigationBar ce et cela pourrait être utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X