Question

J'ai une barre de navigation dans une application iPhone avec UIBarButtonItems personnalisés dans ce:

UIBarButtonItem* homePersonButton = [[UIBarButtonItem alloc]
       initWithImage:[UIImage imageNamed:@"homePerson.png"]
               style:UIBarButtonItemStylePlain
              target:self action:@selector(showHomePerson)];

Le homePerson.png est de 20 x 18.

Il semble bien en mode portrait, mais en mode paysage l'image 20x18 sur le bouton est trop grand pour belle apparence. Il ressemble à iOS fait un travail sur les boutons standard pour rétrécir l'image au besoin quand il est dans un bar plus mince nav.

Quelle est la meilleure façon de gérer cela?

Un autre exemple est quand j'ai un bouton personnalisé dans la titleview de la barre de navigation. J'ai besoin pour rétrécir et lors de la rotation de l'application.

Merci à l'avance pour les conseils que vous pouvez me donner!

Était-ce utile?

La solution

La taille d'une barre d'outils et de l'image de la barre de navigation est de 20 x 20 donc quand vous fournir une image qui ne répond pas à ces dimensions vous laissant place le cadre pour redimensionner / l'échelle de votre image qui est à l'origine de votre problème. Redimensionner / échelle de votre image à 20x20 et votre image doit sembler correct dans les deux modes portrait et paysage.

Autres conseils

steipete a mentionné dans les commentaires, mais je me sens comme il doit être une réponse maintenant. Comme d'iOS 5, vous pouvez utiliser le UIBarButtonItem initialiseur :

- initWithImage:landscapeImagePhone:style:target:action:

Il suffit de définir l'image landscapeImagePhone à une version plus petite de l'image que vous voulez redimensionné dans le paysage.

Après quelques tests, je remarque que l'iPhone ne se rétracte sur la barre de navigation et donc les UIBarButtonItems sur la barre de navigation, mais l'iPhone 6 Plus ne pas . Le 6 Plus semble garder la barre de navigation à une hauteur de 44px, alors que l'iPhone régulière se rétrécit vers le bas à 32px. De ce fait, le 6 Plus aussi ne pas utiliser le landscapeImagePhone dans le paysage.

Je l'ai testé cela en utilisant non seulement une image plus petite taille pour landscapeImagePhone, mais une image complètement différente. L'image n'a jamais changé le 6 Plus.

Cependant, soyez conscient de ce qui suit comme d'iOS 9.2 sur l'iPhone 6 Plus:

documentation Apple pour les états de cette initialiseur que landscapeImagePhone est:

  

L'image à utiliser pour l'élément dans les bars du paysage dans l'idiome UIUserInterfaceIdiomPhone.

d'iOS 9.2, le 6 Plus fait rapport que UIUserInterfaceIdiomPhone dans le portrait et le paysage. Avant, le 6 Plus utilisé pour être UIUserInterfaceIdiomUnspecified. Je ne suis pas sûr quand cela a été mis à jour. Mais, puisqu'il est maintenant UIUserInterfaceIdiomPhone, selon la documentation, l'landscapeImagePhone doit appliquer au 6 Plus ainsi.

Alors peut-être qu'il ne repose pas tant sur la UIUserInterfaceIdiom autant qu'il fait sur la hauteur de la barre de navigation. Je ne sais pas pour sûr. Il suffit de noter que cette incohérence peut être « fixé » à l'avenir et donc la cause d'un comportement différent.

J'ai problème similaire. Maintenant, j'utilise le type personnalisé à bouton. par exemple. voici mon catalogue de UIBarButtonItem. vous pouvez l'utiliser pour construire un bouton de la barre personnalisée.

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image highlightedImage:(UIImage *)highlightedImage     target:(id)target action:(SEL)action{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
    button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:button];

    return barItem;
}

Ensuite, vous pouvez régler le bouton de la barre cadre de la vue personnalisée lorsque rotate.

Conseil:

  1. dans le procédé rotation, par exemple, willAnimateRotationToInterfaceOrientation, imprimez la vue personnalisée cadre des éléments de bouton barre de navigation .. et obtenir le bon cadre (en mode protrait) que vous voulez, vous pouvez également voir le cadre est incorrect en mode paysage, nous avons besoin de le corriger.
  2. résoudre le problème de cadre de bouton de barre de paysage en faisant référence à la valeur d'image correcte.

dans mon cas, je viens de solution simple à l'origine de l'affichage personnalisé ... par exemple.

// adjust the navigation Item top, otherwise it is not proper set after rotation
_centralRootViewController.navigationItem.leftBarButtonItem.customView.top = 5;
_centralRootViewController.navigationItem.rightBarButtonItem.customView.top = 5;

Note:. Dessus est le y de cadre

scroll top