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.
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.
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 ]
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
}
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:)
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.
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.
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.
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.
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))
}
}
}
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