Yo estaba usando iOS 6.1 antes, pero ahora me he mudado a iOS 7. Junto con otros problemas, he observado que en mi barra de navegación de la izquierda del espacio de la izquierda el botón de la barra de elemento y a la derecha el espacio vacío de la derecha de la barra de botones elemento son bastante más en IOS 7 que en iOS 6.

Que necesito saber es cómo puedo reducir los espacios vacíos de la izquierda, a la derecha de la barra de elementos de botón en la barra de navegación??

Gracias de antemano.

InformationsquelleAutor Salman Zaidi | 2013-09-20

14 Comentarios

  1. 219

    Yo también tenía que hacer frente a este problema. También tengo sentimientos que en iOS 7 hay más espacio. Y me di cuenta de que esto es de unos 10 puntos más. Yo suelo usar espacios negativos cuando quiero para LeftBarItemButton para iniciar desde el borde. Esto puede ser útil para usted.

    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];
    • Esto no parece estar funcionando en iOS 7.
    • Su realmente trabajando en iOS 7, como yo lo estoy usando en mi par de proyectos ahora mismo… no hay diferencia en el punto del sistema de modo que usted tiene que tener cuidado de que….
    • No funciona si lo haces [NSArray arrayWithObjects:requiredButton, negativeSpacer]. Tenga en cuenta el orden.
    • Funciona muy bien, y tenga en cuenta que para rightBarButtonItems el espaciador debe ser el primer elemento de la matriz si desea cambiar el margen derecho
    • Incluso puedes probar con esta categoría para establecer los márgenes: github.com/devxoul/UINavigationItem-Margin
    • para el iPhone 6, el 16 de margen no parece funcionar. -20 parece bien.. Alguna idea de cómo podemos hacer que esto funcione bien en todos los dispositivos iPhone?
    • Cuando he puesto esto en ese tiempo no hubo iPhone 6 o 6 + 🙂
    • ¿por qué es el ancho determinado valor negativo?
    • un ancho positivo sería un espaciador que aumenta la ¿cuánto espacio vacío que hay antes de que el primer elemento visual. Este truco de un ancho negativo disminuye el espacio vacío.
    • Hay una manera de conseguir que esto funcione para varios botones? Tengo tres botones y me gustaría reducir el espaciado entre cada uno de ellos.
    • solución sucia ((((. Apple, Apple….
    • Me pregunto también. Porque me encontré con el «negativo» espacio de la solución no funciona para 2 o más UIBarButtonItem. Parece que el espacio es también afectada por la titleView ancho.
    • trate de usar flexibleSpace, usted puede mezclar y combinar así.
    • No funciona si hay más de 1 botón, iOS 12

  2. 23

    Basa en @C_X su respuesta, he creado una categoría, que agrega y posiciones de la UIBarButtonItem basado en la versión de iOS del dispositivo actual.

    //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

    En su opinión, el controlador puede utilizar ahora [self.navigationItem addLeftBarButtonItem:leftBarButtonItem]; y [self.navigationItem addRightBarButtonItem:rightBarButtonItem];

    También he intentado crear subclases de UIButton y reemplazar -alignmentRectInsets pero esto me dio problemas con las transiciones entre los puntos de vista.

  3. 10

    Para Swift 2.0, esta fue mi solución para conseguir el siguiente efecto…

    (los valores reales pueden ser diferentes, dependiendo de su situación)

    Cómo Editar los Espacios Vacíos de la Izquierda, a la Derecha UIBarButtonItem en UINavigationBar [iOS 7]

    let captureButton = UIButton()
    captureButton.setTitle("CAPTURE DETAILS", forState: .Normal)
    captureButton.frame = CGRectMake(0, 0, 200, 95)
    captureButton.addTarget(self, action: Selector("showCaptureDetailsForm:"), forControlEvents: .TouchUpInside) //*** See update below for Swift 2.2 syntax
    captureButton.setBackgroundImage(UIImage(named: "blueTopRight"), forState: .Normal)
    
    let rightBarButton = UIBarButtonItem()
    rightBarButton.customView = captureButton        
    
    let negativeSpacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
    negativeSpacer.width = -25;
    
    self.navigationItem.setRightBarButtonItems([negativeSpacer, rightBarButton ], animated: false)

    Swift 2.2 ACTUALIZACIÓN:

    Para Swift 2.2, el action: Selector método ha cambiado, y debe ser escrito de la siguiente manera

    captureButton.addTarget(self, action: #selector(YourViewController.showCaptureDetailsForm(_:)), forControlEvents: .TouchUpInside)

  4. 6

    Con el fin de corregir este error, debe subclase UIButton de modo que usted puede reemplazar alignmentRectInsets. De mis pruebas, tendrá que regresar un UIEdgeInsets con un derecho positivo de desplazamiento o un positivo a la izquierda desplazamiento, dependiendo de la posición del botón. Estos números no tienen sentido para mí (al menos uno de ellos debe ser negativo, de acuerdo con el sentido común), pero esto es lo que realmente funciona:

    - (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;
    }

    Agradecimiento especial a @zev para sugiriendo que trate de ajustar alignmentRectInsets.

    • gracias por la respuesta. Aunque es una buena solución, pero yo he preferido @C_X respuesta, porque ahora mismo estoy tratando de evitar la sub-classing..
    • Esto me causó alguna extraña cambio de los botones durante las animaciones de iOS 6, que comenzaría en el lugar equivocado y shift para que coincida con los márgenes después de la animación completa.
    • No me sorprendería. El código anterior sólo es necesario para obtener una versión de iOS 6 el diseño de estilo de iOS 7 se construye.
    • Solución rápida, Buen trabajo. Sin embargo, para iOS 9, usted necesita para volver a los márgenes no se establece ellos:
  5. 5

    Siguientes smek del plomo hice una categoría pero modificado para proporcionar compatibilidad hacia atrás en lugar de hacia delante. Yo instalación que todo funcione como yo quiero que en iOS 7 y, a continuación, si el usuario está ejecutando algo más bajos que iniciar la retirada del estiércol con las cosas.

    @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

    Y, a continuación, para obtener este globalmente, tengo una delgada UIViewController subclase que todos los de mi punto de vista de los controladores de heredar.

    @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

    Me doy cuenta de que estoy comprobando la versión del sistema operativo dos veces (una vez en INFViewController y de nuevo en la categoría), la he dejado en la categoría de caso quiero usar esto como un one-off en cualquier lugar en el proyecto.

  6. 5

    para swift usted puede hacer esto

    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 */]
  7. 5

    Esta es mi solución para Swift 3.0:

    rightBtn.imageInsets = UIEdgeInsets(top: 0, left: -13.0, bottom: 0, right: 13.0) self.navigationItem.rightBarButtonItem = rightBtn
    • No hace nada….
  8. 4

    Swift 3:

    let negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
            negativeSpacer.width = -10
    self.navigationItem.leftBarButtonItems = [negativeSpacer, yourBarButtonItem]
  9. 4
    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
                    }
                }
    • este método se llama con retraso
    • Esta es la solución exacta para ello, el espacio negativo de no trabajar a partir de iOS 11
  10. 2

    Swift 3.1

    A dar a la izquierda el botón de la barra de elemento de espacio negativo:

        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) 

  11. 1

    Negetive espacio no funcionará desde iOS 11

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

    Código anterior quitar margen de ambos lados leftBarButtonItem y RightBarButtonItem. Si necesita agregar un margen extra(Después de la eliminación de margen) añadir el siguiente código

        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]
  12. 0

    Creo que usted necesita para utilizar un botón personalizado con un UIButton subclase, y en la subclase, anular -alignmentRectInsets. Se me olvida si usted necesita un valor positivo o negativo para el borde apropiado para conseguir que se mueva correctamente, pero si uno no funciona, pruebe con el otro.

  13. 0

    trabajado para mí

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

  14. -1

    Agradable decisión, muchas gracias!
    Tuve que agregar sólo dos elementos a la izquierda del encabezado de navegación.
    Esta es mi solución:

      //Settings Button
      //This trick correct spacing between two left buttons
      UIBarButtonItem *settingsButtonItem = [[UIBarButtonItem alloc] init];
      UIView *settingsButtonItemView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 22.0, 22.0)];
      settingsButtonItem.customView = settingsButtonItemView;
      UIButton *settingsButton = [UIButton buttonWithType:UIButtonTypeSystem];
      settingsButton.frame = settingsButtonItemView.frame;
      [settingsButton setImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal];
      settingsButton.tintColor = [[[[UIApplication sharedApplication] delegate] window] tintColor];
      [settingsButton addTarget:self action:@selector(showSettings:) forControlEvents:UIControlEventTouchDown];
      [settingsButtonItemView addSubview:settingsButton];
    
      //Star Button
      UIBarButtonItem *starButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"star_gray"] style:UIBarButtonItemStyleBordered target:self action:@selector(showStarred)];
      starButtonItem.width = 22.0;
      NSLog(@"%f", starButtonItem.width);
    
      //Negative Spacer
      //It shifts star button to the left
      UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
      negativeSpacer.width = -10.0;
    
      NSArray *leftNavigtaionBarButtonItems = @[negativeSpacer, starButtonItem, settingsButtonItem];
      [self.navigationItem setLeftBarButtonItems:leftNavigtaionBarButtonItems];

Dejar respuesta

Please enter your comment!
Please enter your name here