web-dev-qa-db-fra.com

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 constaté que dans la barre de navigation, l'espace gauche du bouton gauche et celui de droite étaient assez 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.

79
Salman Zaidi

Je faisais également face à ce problème. J'ai aussi le sentiment que dans iOS 7, il y a plus d'espace. Et j’ai compris que c’est environ 10 points de plus. J'utilise généralement des espaces négatifs lorsque je souhaite que LeftBarItemButton démarre à partir de Edge. 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:@[negativeSpacer, requiredButton]; /* this will be the button which you actually need */] animated:NO];
217
Adnan Aftab

Sur la base de la réponse de @C_X, j'ai 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 de remplacer -alignmentRectInsets, mais cela m'a causé des problèmes de transition entre les vues.

23
smek

Afin de corriger ce bogue, vous devez sous-classe UIButton afin de pouvoir remplacer alignmentRectInsets. D'après mes tests, vous devrez renvoyer une UIEdgeInsets avec un décalage positif à droite ou un décalage positif à gauche, en fonction de la position du bouton. Ces chiffres n'ont aucun sens pour moi (au moins un d'entre eux devrait être négatif, selon le bon sens), 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 m'avoir suggéré d'essayer d'ajuster alignmentRectInsets.

6
jaredsinclair

pour Swift tu peux faire ça

var negativeSpace:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
negativeSpace.width = -17.0
self.navigationItem.rightBarButtonItems = [negativeSpace, requiredButton /* this will be the button which you actually need */]
5
reza pahlevi

Suivant l'exemple de smek j'ai créé une catégorie, mais je l'ai modifiée pour fournir une compatibilité en amont plutôt que des versions en aval. J'ai tout configuré pour fonctionner comme je le veux dans iOS 7, puis si l'utilisateur exécute quelque chose de plus bas, je commence à bidouiller des 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 cela globalement, j'ai une sous-classe UIViewController mince dont tous mes contrôleurs de vue héritent.

@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 vérifie la version du système d'exploitation deux fois (une fois dans INFViewController et encore dans la catégorie), je l'ai laissée dans la catégorie au cas où je souhaite l'utiliser comme élément ponctuel n'importe où dans le projet.

5
Chris Wagner

Swift 3:

let negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
        negativeSpacer.width = -10
self.navigationItem.leftBarButtonItems = [negativeSpacer, yourBarButtonItem]
4
Dvole

Ceci est ma solution pour Swift 3.0:

rightBtn.imageInsets = UIEdgeInsets(top: 0, left: -13.0, bottom: 0, right: 13.0) self.navigationItem.rightBarButtonItem = rightBtn
4
tuandapen

Swift 3.1

Pour donner un espace négatif à un élément du bouton de barre gauche:

    let backButton = UIButton.init(type: .custom)
    backButton.frame = CGRect.init(x: 0, y: 0, width: 40, height: 40)
    // negative space
    backButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -44.0, bottom: 0, right: 0)
    backButton.setImage(Ionicons.iosArrowBack.image(30, color: UIColor(hex: 0xFD6250)), for: .normal)
    backButton.addTarget(self, action: #selector(InviteVC.goBack), for: .touchUpInside)   
    // set back button
    self.navigationItem.leftBarButtonIteUIBarButtonItem.init(customView: backButton) 

2
rp2701
As of iOS 11 wont accept negative space width, in order to align the bar button items to the margin, I have used the below code.

 override func viewWillLayoutSubviews() {
                super.viewWillLayoutSubviews()
                for view in (self.navigationController?.navigationBar.subviews)! {
                    view.layoutMargins = UIEdgeInsets.zero
                }
            }
2
vinny

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

0
Zev Eisenberg

a travaillé pour moi

rightBarButton.customView? .transform = CGAffineTransform (translationX: 10, y: 0)

0
junky

L'espace Negetive ne fonctionnera pas sous iOS 11

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    // to remove navigation bar extra margin
    for view in (self.navigationController?.navigationBar.subviews)! {
        view.layoutMargins = UIEdgeInsets.zero
    }
}

Le code ci-dessus supprimera la marge des deux côtés leftBarButtonItem et RightBarButtonItem. Si vous devez ajouter une marge supplémentaire (après avoir supprimé la marge), ajoutez le code suivant

    let rightButton = UIButton(frame: CGRect(x: 0, y: 0, width: 17, height: 20))
    rightButton.setImage(UIImage(named: "ic_cart"), for: .normal)

    let rightBarButtomItem = UIBarButtonItem(customView: rightButton)

    let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.fixedSpace, target: nil, action: nil)
    spacer.width = 28 //This will add extra margin on right side
    navigationItem.rightBarButtonItems = [spacer,rightBarButtomItem]
0
Rafiqul Hasan