Cómo ajustar el espacio entre dos UIBarButtonItem en rightBarButtonItems


Estoy usando los siguientes códigos para agregar dos botones a uno mismo.navigationItem.rightBarButtonItems, y creo que en iOS7, el espacio entre dos botones son demasiado amplios, hay una manera de disminuir el espacio entre estos dos botones?

UIBarButtonItem *saveStyleButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"save.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(saveStyle)];

UIBarButtonItem *shareStyleButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(shareStyle)];

NSArray *arr= [[NSArray alloc] initWithObjects:shareStyleButton,saveStyleButton,nil];

self.navigationItem.rightBarButtonItems=arr;

Apreciar cualquier sugerencia o idea.

Author: Bob, 2014-03-30

9 answers

Actualizado en Jul 2015

Una mejor manera de hacer esto es usar storyboard (probado en Xcode 6.4). En primer lugar, agregue un UINavigationItem; en segundo lugar, agregue un elemento de Botón de Barra; en tercer lugar, agregue una vista al Elemento de Botón de Barra que acaba de crear en el paso 2; en cuarto lugar, agregue tantos botones como desee en esa vista que acaba de arrastrar; por último, ajuste el espacio con el mouse y las restricciones.

Cuestiones conexas

No se pueden asignar varios botones a UINavigationItem cuando usando Storyboard con iOS 5

Cómo agregar botones al controlador de navegación visible después de seguing?


Respuesta antigua (Solo aceptable para inserciones pequeñas)

Usar la propiedad imageInsets:

leftButton.imageInsets = UIEdgeInsetsMake(0.0, 0.0, 0, -15);
rightButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, 0);

Para tres o más botones, el(los) medio (s) obtienen ambas inserciones:

leftButton.imageInsets = UIEdgeInsetsMake(0.0, 0.0, 0, -15);
middleButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, -15);
rightButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, 0);

Para los botones del lado derecho, tenga cuidado: el PRIMER botón en la matriz de elementos es el CORRECTO:

rightButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, 0);
middleButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, -15);
leftButton.imageInsets = UIEdgeInsetsMake(0.0, 0.0, 0, -15);

IMPORTANTE: Dividir el recuadro entre los dos vecinos; si se aplica todo el recuadro a un borde, se hará obvio que los botones se superponen en el espacio "en blanco" - un botón obtiene todos los toques de "espacio". Incluso cuando "divide" el ajuste de esta manera, en -40 en ambos bordes, el toque definitivamente irá al botón equivocado a veces. -15 o -20 es lo más a considerar con esta técnica.

Aplicando este método, el botón podría incluso moverse en cuatro direcciones.

 47
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:18

Si estás buscando tener 2 botones en la parte superior derecha sin espacio entre ellos o a la derecha, esto ha funcionado para mí.

let imgLeft = UIImage(named: "buttonLeft")?.imageWithRenderingMode(.AlwaysOriginal)
let bLeft = UIBarButtonItem(image: imgLeft, style: UIBarButtonItemStyle.Done, target: self, action: "action1:")
let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
space.width = -16.0

bLeft.imageInsets = UIEdgeInsetsMake(0, 0, 0, -25.0)


let imgRight = UIImage(named: "buttonRight")?.imageWithRenderingMode(.AlwaysOriginal)
let bRight = UIBarButtonItem(image: imgRight, style: UIBarButtonItemStyle.Done, target: self, action: "action2:")

bRight.imageInsets = UIEdgeInsetsMake(0, -25, 0, 0)


self.navigationItem.rightBarButtonItems = [space,bLeft,bRight ]
 4
Author: abinop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-11 21:50:32

Mi situación se trataba de dar espacio horizontal al botón de Cierre de sesión en el borde derecho.

 func addLogOutButtonToNavigationBar(triggerToMethodName: String)
    {
        let button: UIButton = UIButton()
        button.setImage(UIImage(named: "logOff.png"), forState: .Normal)
        button.frame = CGRectMake(20, 0, 30, 25)
        button.contentEdgeInsets = UIEdgeInsets.init(top: 0, left: 10, bottom: 0, right: -10)

        button .addTarget(self, action:Selector(triggerToMethodName), forControlEvents: UIControlEvents.TouchUpInside)
        let rightItem:UIBarButtonItem = UIBarButtonItem()
        rightItem.customView = button
        self.navigationItem.rightBarButtonItem = rightItem
    }
 4
Author: A.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 10:02:52

Podría ser un poco tarde para esta respuesta, sin embargo, esto puede ayudar a la combinación más reciente de IOS+Swift (IOS 10 y Swift 3 en mi caso). Aquí describo un enfoque general sobre cómo mover elementos a la derecha / izquierda para rightBarButtonItems / leftBarButtonItems:

La propiedad que tenemos que usar aquí para mover un barButtonItem es "imageEdgeInsets" . Entonces, Aquí cómo usar esta propiedad -

yourBarButtonItem.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right)

Estos top, left, bottom, right son de tipo CGFloat y estos son básicamente valor de margen eso empuja su artículo de / a uno al otro. Para disminuir un espacio, podemos usar valores menos ( - ) como este " -10 ".

Así que, por ejemplo, si queremos usar esto para un grupo de leftBatButtonItems y decir, si queremos mover un elemento a un bit a la derecha, entonces podemos hacer esto -

ourBarButtonItem.imageEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, -15)

Espero que tengamos la idea general aquí y espero que ayude:)

 4
Author: sahilabrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-17 14:24:49

Cree un UIBarButtonItem con el tipo espacio flexible o fijo. Establezca el ancho y agréguelo a la matriz de barbuttonitems. Intente usar un ancho negativo, vea si funciona.

O, tal vez podría ajustar su imagen. Creo que los botones del sistema tienen un tamaño fijo y podrían incluir alguna parte transparente, por lo que incluso cuando se empaquetan juntos, todavía parecen espaciados.

 2
Author: Joride,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-30 21:10:45

Sin ningún código. Acabo de poner otro UIBarButtonItem entre los botones que necesitan espacio en storyboard. El botón es solo un marcador de posición para el espaciado y el UIBarButton debe tener UIView como subview del UIBarButtonItem. ajusta el ancho de la vista para tu espaciado. Consulte Capturas de pantalla.

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

 2
Author: iOSCodeJunkie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-21 21:34:37

Para lograr esto en código sin agregar una vista de contenedor adicional, use un UIBarButtonItem con el tipo de elemento del sistema establecido en FixedSpace. Luego establezca el ancho del espacio fijo en -10 y colóquelo entre los dos botones.

 1
Author: Alex311,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-04 23:08:23

Encontré una idea loca que funciona.

func createCustomToolbar(items: [UIBarButtonItem]) -> UIToolbar
{
    // no spacing between bar buttons
    let customToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: items.count*45, height: 44))
    customToolbar.items = items
    customToolbar.barStyle = UIBarStyle(rawValue: -1)!
    customToolbar.clearsContextBeforeDrawing = false
    customToolbar.backgroundColor = UIColor.clearColor()
    customToolbar.tintColor = UIColor.clearColor()
    customToolbar.translucent = true
    return customToolbar
}


let customToolbar = createCustomToolbar([item0,item1,item2,item3])
navigationItem.rightBarButtonItems = [UIBarButtonItem(customView: customToolbar)]

Probado en iOS7 y superior. Incluso esto está escrito en swift, el concepto es claro.

 0
Author: Prcela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-06 08:57:28

Renuncié a luchar contra este error, y se me ocurrió la siguiente extensión:

import UIKit

extension UIBarButtonItem {

    convenience init(buttonImage: UIImage?, target: Any?, action: Selector?) {
        let button = UIButton(type: .system)
        button.frame = CGRect(origin: CGPoint.zero, size: buttonImage != nil ? buttonImage!.size : CGSize.zero)
        button.setImage(buttonImage, for: .normal)

        if let action = action {
            button.addTarget(target, action: action, for: .touchUpInside)
        }

        self.init(customView: button)
    }

    public func updateButton(image: UIImage?) {
        if let button = self.customView as? UIButton {
            button.setImage(image, for: .normal)

            let size = image != nil ? image!.size : CGSize.zero
            let frame = button.frame
            button.frame = frame.insetBy(dx: ceil((frame.size.width - size.width) / 2), dy: ceil((frame.size.height - size.height) / 2))
        }
    }
}
 0
Author: bteapot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 16:05:49