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.
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];
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.
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
.
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 */]
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.
Swift 3:
let negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
negativeSpacer.width = -10
self.navigationItem.leftBarButtonItems = [negativeSpacer, yourBarButtonItem]
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
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)
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
}
}
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.
a travaillé pour moi
rightBarButton.customView? .transform = CGAffineTransform (translationX: 10, y: 0)
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]