84 votes

Comment modifier des espaces vides de gauche, de droite UIBarButtonItem dans UINavigationBar [iOS 7]

J'utilisais iOS 6.1 auparavant, mais je suis maintenant passé à iOS 7. Parallèlement à d'autres problèmes, j'ai observé que, dans la barre de navigation, l'espace gauche du bouton gauche et celui de droite étaient assez différents. plus dans IOS 7 que dans iOS 6.

J'ai besoin de savoir s'il existe un moyen de réduire les espaces vides des éléments de boutons de barre de gauche et de droite dans la barre de navigation.

Merci d'avance.

223voto

C_X Points 3224

Je faisais également face à ce problème, et j’ai aussi l’impression que sous iOS 7, il ya plus d’espace. Et je pense que cela représente environ 10 points de plus. J'utilise généralement des espaces négatifs lorsque je veux démarrer LeftBarItemButton pour commencer à partir du bord. Cela peut être utile pour vous aussi.

 UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                  target:nil action:nil];
negativeSpacer.width = -16;// it was -6 in iOS 6
[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, requriedButton/*this will be the button which u actually need*/, nil] animated:NO];
 

J'espère que cela fonctionnera pour vous ...

23voto

smek Points 622

Sur la base de @C_X, sa réponse a créé une catégorie qui ajoute et positionne UIBarButtonItem en fonction de la version iOS du périphérique actuel.

 // UINavigationItem+Additions.h
@interface UINavigationItem (Additions)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;
@end

// UINavigationItem+Additions.m
@implementation UINavigationItem (Additions)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        // Add a negative spacer on iOS >= 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                              target:nil action:nil];
        negativeSpacer.width = -10;
        [self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setLeftBarButtonItem:leftBarButtonItem];
    }
}

- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        // Add a negative spacer on iOS >= 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
        negativeSpacer.width = -10;
        [self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setRightBarButtonItem:rightBarButtonItem];
    }
}

@end
 

Dans votre contrôleur de vue, vous pouvez maintenant utiliser [self.navigationItem addLeftBarButtonItem:leftBarButtonItem]; et [self.navigationItem addRightBarButtonItem:rightBarButtonItem];

J'ai également essayé de sous-classer UIButton et d'ignorer -alignmentRectInsets mais cela m'a posé des problèmes de transition entre les vues.

6voto

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.

5voto

Chris Wagner Points 9668

Suivant smek de plomb , j'ai fait une catégorie, mais modifié pour fournir une compatibilité ascendante plutôt que vers l'avant. J'ai installé tout marche comme je le souhaite dans iOS 7 et puis, si l'utilisateur exécute quelque chose de plus faible je commence à coucher avec les choses.

@interface UINavigationItem (BarButtonItemSpacingSupport)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;

@end

@implementation UINavigationItem (BarButtonItemSpacingSupport)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        // Add a spacer on when running lower than iOS 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                                                                        target:nil action:nil];
        negativeSpacer.width = 10;
        [self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setLeftBarButtonItem:leftBarButtonItem];
    }
}

- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        // Add a spacer on when running lower than iOS 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                           initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                           target:nil action:nil];
        negativeSpacer.width = 10;
        [self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setRightBarButtonItem:rightBarButtonItem];
    }
}

@end

Et puis pour obtenir ce à l'échelle mondiale, j'ai un mince UIViewController sous-classe qui tous de mon point de vue, les contrôleurs hérite.

@interface INFViewController : UIViewController

@end

@implementation INFViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        [self setupNavBarForPreIOS7Support];
    }
}

- (void)setupNavBarForPreIOS7Support {
    if (self.navigationController) {
        UINavigationItem *navigationItem = self.navigationItem;
        UIBarButtonItem *leftItem = navigationItem.leftBarButtonItem;
        UIBarButtonItem *rightItem = navigationItem.rightBarButtonItem;

        if (leftItem) {
            [navigationItem addLeftBarButtonItem:leftItem];
        }

        if (rightItem) {
            [navigationItem addRightBarButtonItem:rightItem];
        }
    }
}

@end

Je me rends compte que je suis la vérification de la version du système d'exploitation à deux reprises (une fois en INFViewController et de nouveau dans la catégorie), je l'ai laissé dans la catégorie encas je veux l'utiliser comme un one-off n'importe où dans le projet.

0voto

Zev Eisenberg Points 2839

Je crois que vous devez utiliser un bouton personnalisé avec une sous-classe UIButton et, dans votre sous-classe, remplacer le -alignmentRectInsets . J'oublie si vous avez besoin d'une valeur positive ou négative pour que le bord approprié le déplace correctement, mais si l'un ne fonctionne pas, essayez l'autre.

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