2011-09-05 13 views
9

¿Cómo puedo eliminar el efecto brillo/brillo de los botones en las barras de navegación? Si personalizo la barra de navegación utilizando una imagen personalizada, los botones no se ven afectados, puedo eliminar el efecto de ellos (la línea y el glosar) o definir un código de color hexadecimal para todo el botón, o incluso una imagen personalizada para ellos ¿también?Eliminación del efecto brillo de los botones en un UINavigationBar

+1

@Rudy - Si cree que la pregunta es un duplicado de otra, vote para cerrarla como tal en lugar de editar el cuerpo de la pregunta. –

+0

Este es un posible duplicado de [iOS: Cómo reemplazar el brillo/brillo de fondo de la barra de búsqueda con un color] (http://stackoverflow.com/questions/6696200/ios-how-to-replace-search-bar-background- shine-glow-with-one-color) –

Respuesta

18

Acabo de pasar por el proceso de resolver esto. Básicamente, debe crear imágenes elásticas personalizadas y usarlas como fondo del botón para deshacerse del brillo. Reemplazar los botones de retroceso en un UINavigationController es un poco más difícil. Para eso usé un UINavigationControllerDelegate para reemplazar el botón de retroceso predeterminado con mi botón personalizado.

Aquí hay algo de código:

  1. crear una categoría en UIBarButtonItem que crea su botón personalizado. Aquí está el mío. Yo uso esta categoría para personalizar los dos botones de la barra regulares y los botones traseros:

    @interface UIBarButtonItem (UIBarButtonItem_customBackground) 
    
    + (id) customBarButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector; 
    + (id) customBackButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector; 
    
    @end 
    
    @implementation UIBarButtonItem (UIBarButtonItem_customBackground) 
    
    + (id) customButtonWithImageNamed:(NSString *)imageName selectedImageNamed:(NSString *)selectedImageName leftCapWidth:(CGFloat)leftCapWidth edgeInsets:(UIEdgeInsets)edgeInsets title:(NSString *)title target:(id)target selector:(SEL)selector { 
        UIButton* customButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
        [customButton addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; 
        customButton.titleLabel.font = [UIFont boldSystemFontOfSize:12.0f]; 
        customButton.titleLabel.shadowColor = [UIColor colorWithRed:0.0f/255.0f green:0.0f/255.0f blue:0.0f/255.0f alpha:0.25f]; 
        customButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); 
        customButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation; 
        customButton.titleEdgeInsets = edgeInsets; 
        UIImage* navButtonBackgroundImage = [[UIImage imageNamed:imageName] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0.0f]; 
        UIImage* navButtonPressedBackgroundImage = [[UIImage imageNamed:selectedImageName] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0.0f]; 
        [customButton setBackgroundImage:navButtonBackgroundImage forState:UIControlStateNormal]; 
        [customButton setTitle:title forState:UIControlStateNormal]; 
        [customButton setBackgroundImage:navButtonPressedBackgroundImage forState:UIControlStateHighlighted]; 
        [customButton setBackgroundImage:navButtonPressedBackgroundImage forState:UIControlStateSelected]; 
    
        CGSize size = CGSizeMake(30.0f, 30.0f); 
        if (title != nil) { 
         size = [[NSString stringWithString:title] sizeWithFont:customButton.titleLabel.font]; 
        } 
        customButton.frame = CGRectMake(0.0f, 0.0f, size.width + 20.0f, 30.0f); 
        customButton.layer.shouldRasterize = YES; 
        customButton.layer.rasterizationScale = [[UIScreen mainScreen] scale]; 
        return [[[UIBarButtonItem alloc] initWithCustomView:customButton] autorelease]; 
    } 
    
    + (id) customBarButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector { 
        return [self customButtonWithImageNamed:@"navButtonBG.png" 
           selectedImageNamed:@"navButtonPressedBG.png" 
             leftCapWidth:6.0f 
             edgeInsets:UIEdgeInsetsMake(0.0f, 5.0f, 0.0f, 5.0f) 
               title:title 
              target:target 
              selector:selector]; 
    } 
    
    + (id) customBackButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector {  
        return [self customButtonWithImageNamed:@"backButtonBG.png" 
           selectedImageNamed:@"backButtonPressedBG.png" 
             leftCapWidth:12.0f 
             edgeInsets:UIEdgeInsetsMake(0.0f, 11.0f, 0.0f, 5.0f) 
               title:title 
              target:target 
              selector:selector]; 
    } 
    
    @end 
    
  2. añadir el botón a su UINavigationBar

    UIBarButtonItem* logoutButton = [UIBarButtonItem customBarButtonWithTitle:@"Logout" target:self selector:@selector(logout)]; 
    self.navigationItem.rightBarButtonItem = logoutButton; 
    
  3. Si también desea reemplazar los botones traseros del UINavigationController, la configuración de un UINavigationControllerDelegate e implemente el método willShowViewController como lo siguiente:

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
        if([navigationController.viewControllers count ] > 1) { 
         UIViewController* backViewController = [navigationController.viewControllers objectAtIndex:(navigationController.viewControllers.count - 2)]; 
         NSString* backText = backViewController.title; 
         UIBarButtonItem* newBackButton = [UIBarButtonItem customBackButtonWithTitle:backText target:navigationController selector:@selector(popViewControllerAnimated:)]; 
         viewController.navigationItem.leftBarButtonItem = newBackButton; 
         viewController.navigationItem.hidesBackButton = YES; 
        } 
    } 
    
  4. Aquí están los stretc Hable imágenes que estoy usando:

    • Botón Atrás: back button pulsada: enter image description here
    • botón regular: enter image description here pulsada: enter image description here
+0

USTED. SON. ASI QUE. TENIENDO. ¡¡¡¡¡INCREÍBLE!!!!! ¡Te amo, hombre! – Eugene

+0

@Justin Gallagher Justin gracias ¡gracias, gracias! –

+0

¿Cómo agrego este código a un proyecto para usarlo? –

0

tiene que usar el botón personalizado con imágenes sin ningún efecto de brillo en las imágenes mediante las cuales puede deshacerse del efecto de globo de la barra de navegación.

2

Para cambiar el botón de retroceso no es necesario para poner en práctica el método delegado uinavigationcontroller.

Solo necesita establecer la propiedad hidesBAckButton en SÍ después de configurar el botón deseado como @Justin Gallacher explicó perfectamente.

self.navigationItem.leftBarButtonItem = [UIBarButtonItem customBackButtonWithTitle:@"Back" target:self.navigationController selector:@selector(popViewControllerAnimated:)]; 
self.navigationItem.hidesBackButton = YES; 
+0

Esto ni siquiera es necesario, configurar la propiedad leftBarButtonItem sobreescribirá el botón Atrás – Daniel

Cuestiones relacionadas