75 votes

UIBarButtonItem avec une vue personnalisée pas correctement alignée sur iOS 7 lorsqu’il est utilisé en tant qu’éléments de barre de navigation gauche ou droite

Le code suivant fonctionne vers le haut par le biais d’iOS 6 :

C’est la façon dont le bouton est censé être aligné :

Normal positioning

Toutefois, le bouton semble être sur iOS 7, décalage par rapport à droite ou à gauche par trop de pixels :

Incorrect positioning on iOS 7

Comment puis-je obtenir ma barre personnalisée éléments bouton doivent être alignés correctement ?

67voto

malex Points 2992

Vous pouvez utiliser négative propriété flexible d’espaces et rightBarButtonItems au lieu de rightBarButtonItem :

57voto

jaredsinclair Points 6858

Afin de corriger ce bug, vous devez sous-classe UIButton de sorte que vous pouvez remplacer alignmentRectInsets. De mon test, vous aurez besoin de retourner un UIEdgeInsets avec soit un droit positif de décalage ou un décalage gauche, en fonction de la position du bouton. Ces chiffres n'ont pas de sens pour moi (au moins l'un d'entre eux devrait être négatif, selon le sens commun), mais c'est ce qui fonctionne réellement:

- (UIEdgeInsets)alignmentRectInsets {
    UIEdgeInsets insets;
    if (IF_ITS_A_LEFT_BUTTON) {
        insets = UIEdgeInsetsMake(0, 9.0f, 0, 0);
    } 
    else { // IF_ITS_A_RIGHT_BUTTON
        insets = UIEdgeInsetsMake(0, 0, 0, 9.0f);
    }
    return insets;
}

Un merci spécial à @zev pour suggérant j'ai essayer d'ajuster alignmentRectInsets.

28voto

Basheer_CAD Points 2087

J’ai essayé toutes les réponses ci-dessus et rien n’a fonctionné pour moi. Et voici ce qui fonctionne, si quelqu'un aurait besoin de ceci :

(Aucun sous-classement nécessaire)

-Jetez un oeil au résultat.

Notez l’espace depuis le bouton de droite (le bouton de droite est le comportement par défaut) et le bouton gauche

enter image description here

10voto

Chris Wagner Points 9668

Ok, je suis allé de l’autre « sens ». J’ai fait tout aligner correctement via la table de montage séquentiel avec iOS 7 (en supposant que c’est comment il continuera à travailler). Puis en utilisant l’approche de sous-catégorie décrire, j’ai le sous-catégorie `` avec l’implémentation suivante.

Si ce code ne fonctionne que si l’appareil est iOS avant 7.

Merci pour l’idée @jaredsinclair !

3voto

Kyle Begeman Points 2159

@jaredsinclair

Voici un coup d'oeil à mon code.

// Create the tweetly button that will show settings
self.tweetlyDisplay = [NavButton buttonWithType:UIButtonTypeCustom];
[self.tweetlyDisplay setFrame:CGRectMake(0, 0, 90, 44)];
[self.tweetlyDisplay setBackgroundColor:[UIColor clearColor]];
[self.tweetlyDisplay setBackgroundImage:[UIImage imageNamed:@"settings.png"] forState:UIControlStateNormal];
[self.tweetlyDisplay setAdjustsImageWhenHighlighted:NO];
[self.tweetlyDisplay addTarget:self action:@selector(tweetlyPressed:) forControlEvents:UIControlEventTouchUpInside];

// Add the Tweetly button as the left bar button item
// This had a glitch that moves the image to the right somewhat
UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.tweetlyDisplay];
self.navigationItem.leftBarButtonItem = leftBarButton;

Voir tout ce qui n'est pas droit?

Voici le résultat. La deuxième image n'est pas visible parce que j'ai eu le temps de prendre la capture d'écran et il est encore en période de transition, mais vous pouvez clairement voir comment il est mal compensée.

Bonne image normale:

This is the good image, before navigating around

Mauvaise Image D'Offset:

You can see the offset is now off again before snapping into place

Après environ une demi-seconde, l'image s'enclenche alors revenir à l'emplacement de l'image.

Voici mon code pour le NavButton.h et .m:

/**********************************************

 NavButton.h

 **********************************************/

#import <UIKit/UIKit.h>

@interface NavButton : UIButton

@end






/**********************************************

 NavButton.m

**********************************************/


#import "NavButton.h"

@implementation NavButton {

    int imageHeight;

}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code

        imageHeight = 44;

    }
    return self;
}

/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect
 {
 // Drawing code
 }
 */


- (UIEdgeInsets)alignmentRectInsets {
    UIEdgeInsets insets;
    if ([self isLeftButton]) {
        insets = UIEdgeInsetsMake(0, 9.0f, 0, 0);
    }
    else { // IF ITS A RIGHT BUTTON
        insets = UIEdgeInsetsMake(0, 0, 0, 9.0f);
    }
    return insets;
}


- (BOOL)isLeftButton {
    return self.frame.origin.x < (self.superview.frame.size.width / 2);
}


// THIS IS THE TRICK.  We make the height of the background rect match the image.
-(CGRect)backgroundRectForBounds:(CGRect)bounds
{
    CGRect bgRect = bounds;
    bgRect.origin.y = (bounds.size.height - imageHeight)/2.0f;
    bgRect.size.height = imageHeight;

    return bgRect;
}


@end

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