iphone - Cómo ajustar el espacio entre dos UIBarButtonItem en rightBarButtonItems
xcode ios7 (9)
Cree un UIBarButtonItem
con un tipo de espacio flexible o fijo. Establezca el ancho y agréguelo a la matriz de barbuttonitems. Intenta usar un ancho negativo, mira si eso funciona.
O tal vez podría ajustar su imagen. Los botones del sistema, creo que tienen un tamaño fijo, y pueden incluir alguna parte transparente, por lo que incluso cuando están empaquetados juntos parecen estar espaciados.
Estoy usando los siguientes códigos para agregar dos botones a self.navigationItem.rightBarButtonItems, y creo que en iOS7, el espacio entre dos botones es demasiado ancho, ¿hay alguna 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;
Aprecio cualquier sugerencia o idea.
Dejé de 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))
}
}
}
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 de manera rápida, el concepto es claro.
Mi situación fue acerca de dar espacio horizontal para el botón logOut 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
}
Para lograr esto en el código sin agregar una vista de contenedor adicional, use un UIBarButtonItem
con el tipo de elemento del sistema establecido en FixedSpace
. A continuación, establezca el ancho del espacio fijo en -10
y colóquelo entre los dos botones.
Puede 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 utilizamos aquí para mover un barButtonItem es "imageEdgeInsets". Entonces, aquí cómo usar esta propiedad -
yourBarButtonItem.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right)
Estas partes superior, izquierda, inferior, derecha son del tipo CGFloat y son básicamente un valor de margen que empuja su artículo de / a otro. Para disminuir un espacio, podemos usar valores negativos (-) como este "-10".
Entonces, por ejemplo, si queremos usar esto para un grupo de leftBatButtonItems y decir, si queremos mover un elemento 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 :)
Si buscas tener 2 botones en la parte superior derecha sin espacio entre ellos o a la derecha, esto me ha funcionado.
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 ]
Sin ningún código. Acabo de poner otro UIBarButtonItem entre los botones que necesitan espacio en el guión gráfico. El botón es solo un marcador de posición para el espaciado y UIBarButton debe tener UIView como subview del UIBarButtonItem. Ajusta el ancho de la vista para tu espacio. Ver capturas de pantalla.
Actualizado en julio de 2015
Una mejor forma de hacerlo es usar el guión gráfico (probado en Xcode 6.4). Primero, agregue un UINavigationItem; en segundo lugar, agregue un elemento de botón de barra; en tercer lugar, agregue una vista al elemento del botón de barra que acaba de crear en el paso 2; en cuarto lugar, agregue tantos botones como desee en la vista que acaba de arrastrar; por último, ajusta el espacio con tu mouse y restricciones.
preguntas relacionadas
No se pueden asignar varios botones a UINavigationItem al usar Storyboard con iOS 5
¿Cómo agregar botones al controlador de navegación visible después de segueing?
Respuesta anterior (Solo aceptable para pequeños recuadros)
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) tienen 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 botón PRIMERO en la matriz de elementos es el DERECHO:
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 aplica toda la inserción a un borde, será obvio que los botones se superponen en el espacio "en blanco": un botón obtiene todos los toques de "espacio vacío". Incluso cuando se "divide" el ajuste de esta manera, en -40 en ambos bordes, el toque definitivamente irá al botón incorrecto a veces. -15 o -20 es lo más a considerar usar con esta técnica.
Al aplicar este método, el botón incluso podría moverse en cuatro direcciones.