Question

Je suis l'ajout d'un arrière-plan personnalisé pour mon UINavigationBar. Il fonctionne très bien aussi longtemps que le téléphone est en mode portrait. Dès que je passe en mode paysage, la moitié de la barre apparaît en bleu (la couleur par défaut de barre de navigation) et la moitié de celui-ci a mon image

Comment puis-je étirer l'image pour le mode paysage et le rendre petit à nouveau pour le mode portrait?

Merci

Solution Incase quelqu'un cherche une réponse à la façon d'ajouter une image à la barre de navigation - va ici

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 480.0, 44.0)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"navbar_landscape" ofType:@"png"]]];
[navigationController.navigationBar addSubview:imgView];
[imgView release];
Était-ce utile?

La solution

Vous avez probablement besoin de régler la autoresizingMask de votre point de vue de l'image d'arrière-plan; essayez d'utiliser UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight

Autres conseils

Dans les deux modes d'orientation de l'écran, il est préférable d'utiliser

[navigationController.navigationBar insertSubview:imgView atIndex:0];

met vue de l'image sous toutes les autres vues et tous les éléments de la barre de navigation par défaut (titre, boutons standard) fonctionnent OK.

Après un peu de recherche et de sentiers et d'erreur, je l'ai trouvé un travail autour, qui ne remplacera pas la barre de navigation lorsque vous entrez dans le mode de lecture vidéo. Hopeefully cela ne je pense pas de problèmes avec causer l'approbation de l'application, mais d'après ce poste, il devrait être bien:

http://developer.apple.com/iphone/library /qa/qa2009/qa1637.html

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if([self isMemberOfClass: [UINavigationBar class]]){
        UIImage *image = [UIImage imageNamed:@"navBarBackground.png"];
        CGContextClip(ctx);
        CGContextTranslateCTM(ctx, 0, image.size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextDrawImage(ctx, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
    }else{
        [super drawLayer:layer inContext:ctx];
    }
}

@end

La solution Ben a fait résoudre le problème, mais il étire l'image en mode paysage. J'ai fini par créer deux un images- pour le paysage et l'autre pour le mode portrait. J'ai ensuite ajouté le code dans shouldAutoRotate pour changer l'image de barre de navigation en fonction de l'orientation

Vous pouvez changer l'image pour les deux portrait et paysage orientations en fournissant des images différentes pour des orientations différentes en vérifiant la taille du cadre de cette barre de UINavigation exemple:

- (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);
}

cette démo complète Xcode projet sur la personnalisation de l'apparence de UINavigationBar pourrait être utile. Il comprend également @ 2x versions d'images d'arrière-plan pour soutenir la rétine affiche sur les appareils iPhone 4.

Essayez la méthode plus simple de [UIImage imageNamed:@"navbar_landscape.png"] depuis un élément d'interface est exactement ce que imageNamed:. est destiné à, comme le montre ljonesATL

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