31

¿Cómo elimino el relleno horizontal a la izquierda y derecha de los elementos personalizados de UINavigationBar a la izquierda y a la derecha? Parece que hay ~ 10 puntos de relleno que iOS establece de forma predeterminada.Colocación de una vista personalizada basada en UIBarButtonItem en la barra de navegación sin relleno horizontal predeterminado

Estoy personalizando los botones de la barra de navegación izquierda y derecha (he renunciado a intentar establecer mi propio backButtonItem, así que estoy usando el leftBarButtonItem).

En cualquier caso (izquierda o derecha), presionar estos botones personalizados indica que Apple parece conservar algo de relleno a la izquierda del artículo LeftBarButtonItem, ya la derecha del elementoBarButtonItem derecho; Independientemente de cuán ancho haga las propiedades de fondo e imagen personalizadas del UIButton que coloco dentro del elemento del botón de la barra izquierda/derecha como su vista personalizada.

Dado que UIBarButtonItems no tiene ningún "marco" al que pueda acceder, no puedo ubicarlos dentro de su supervista como lo hago con UIViews normales.

¿Alguna sugerencia sobre cómo eliminar este relleno predeterminado? Vea la captura de pantalla adjunta para ver el bit que estoy tratando de reducir a un ancho cero. En la captura de pantalla, el icono más aparece desplazado hacia la derecha porque le di un recuadro; pero la imagen de fondo resaltada, también presumiblemente usando ese recuadro, se recorta en su lado derecho).

Ver la imagen en: https://skitch.com/starbaseweb/rj2e5/ios-simulator

Como referencia, así es como estoy creando mi costumbre UIBarButtonItem (en este caso, es el botón de la derecha):

- (UIBarButtonItem *)customAddButtonItemWithTarget:(id)target action:(SEL)action { 
    UIButton *customButtonView = [UIButton buttonWithType:UIButtonTypeCustom]; 

    customButtonView.frame = CGRectMake(0.0f, 0.0f, 45.0f, 44.0f); 

    [customButtonView setBackgroundImage: 
     [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Normal.png"] 
     forState:UIControlStateNormal]; 
    [customButtonView setBackgroundImage: 
     [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Highlighted.png"] 
     forState:UIControlStateHighlighted]; 

    [customButtonView setImage: 
     [UIImage imageNamed:@"bgNavBarButton-Add-Normal.png"] 
     forState:UIControlStateNormal]; 
    [customButtonView setImage: 
     [UIImage imageNamed:@"bgNavBarButton-Add-Highlighted.png"] 
     forState:UIControlStateHighlighted]; 

    [customButtonView addTarget:target action:action 
     forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *customButtonItem = [[[UIBarButtonItem alloc] 
     initWithCustomView:customButtonView] autorelease]; 
    [customButtonView setImageEdgeInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f)]; 

    //customButtonItem.imageInsets = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f); 

    return customButtonItem;  
} 
+0

+1: tuve este problema y probé varias cosas ... incluyendo inserciones, y solo haciendo la imagen a -10 en la posición x, etc. No tuve suerte, así que solo guardé el pequeño relleno y rehice el imagen para hacerlo más apropiado. buena suerte. –

Respuesta

82

55 Como he comentado anteriormente, la solución que elegí se basa en esta respuesta a una pregunta diferente, pero muy relacionada: How to adjust UIToolBar left and right padding. También es facilitado por (y depende de) iOS5, que le permite configurar múltiples botones en el lado izquierdo o derecho, en lugar de solo uno.

He aquí un ejemplo de eliminar el relleno a la izquierda de un elemento de botón personalizado izquierda:

UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view 

// Create a negative spacer to go to the left of our custom back button, 
// and pull it right to the edge: 
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
    target:nil action:nil]; 
negativeSpacer.width = -5; 
// Note: We use 5 above b/c that's how many pixels of padding iOS seems to add 

// Add the two buttons together on the left: 
self.navigationItem.leftBarButtonItems = [NSArray 
    arrayWithObjects:negativeSpacer, backButtonItem, nil]; 

Y con esto, el relleno a la izquierda para el elemento de botón de barra de la izquierda en una barra de navegación, se ha ido!

NOTA: Esto me ha funcionado en iOS5 e iOS6. Dado que iOS7 es considerablemente diferente (de las demostraciones públicas), aquellos de ustedes con las primeras semillas de iOS7 deberían probar si algo tan involuntario, como este truco, continuará funcionando para ustedes más allá de iOS6.

+7

Funciona también para los artículos de barra derechos sin cambiar el orden (podría tener la tentación de invertir el orden de BackButtonItem y negativeSpace pero no lo es) – Martin

+0

¡Gracias por esto! – chourobin

+0

Realmente gracias por este hombre! :) –

3

He intentado esto y funciona :

1) Cree una subclase de UIToolbar personalizada, que no hace nada en -drawRect :, y no es opaca, y tiene backgroundColor = [UIColor clearColor].

2) Cree un UIBarButtonItem personalizado con la barra de herramientas como vista personalizada.

3) Agregue sus botones a la barra de herramientas personalizada.

4) En su barra de herramientas personalizada anule -layoutSubviews y haga su propio espaciado.

+0

Otro truco es que simplemente puede hacer que la barra de navegación sea más ancha que la ventana gráfica, por lo que el relleno correcto se recorta y su botón aparece en el lugar correcto. Esto solo funciona si administra el UINavigationBar directamente, es decir, no a través de un controlador de navegación. –

+0

Gracias Evadne. Pasé de esto con una solución alternativa, pero intentaré volver a este post para confirmar la solución sugerida que tienes para poder marcarla como la respuesta aceptada. – idStar

+0

Encontré una implementación más limpia, posible con iOS5. Vea la respuesta aquí: http://stackoverflow.com/questions/6021138/how-to-adjust-uitoolbar-left-and-right-padding/7042201#7042201 Probé esta solución y funcionó. Dos líneas de código y la menos intrusiva. – idStar

Cuestiones relacionadas